Dockerignore: Bỏ qua mọi thứ ngoại trừ một tệp và Dockerfile


89

Vì vậy, mục đích chính là làm đặc một ứng dụng lọ béo và đưa nó vào Elasticbeanstalk. Vấn đề là với bối cảnh. Hơi ngu ngốc khi thêm quá nhiều ngữ cảnh vào docker nếu tất cả những gì tôi cần thực sự là một tệp jar duy nhất.

Tôi đã thử với tệp .dockerignore, nhưng tôi đã bị mất. Tôi đã cố gắng sử dụng phủ định gitignore, nhưng nó không hoạt động.

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

Cũng có điều đó với regex, nhưng có vẻ như regex phức tạp không được hỗ trợ.

^((?!Dockerfile).)*$

Tôi cũng đã thử tìm kiếm trong stackoverflow và tôi đã tìm thấy hai thứ này:

Câu hỏi này có thể giống với câu thứ hai, nhưng tôi nghĩ nó hơi khác vì ở đây, tôi chỉ muốn đưa một tệp duy nhất vào ngữ cảnh.

Bất kỳ trợ giúp sẽ được đánh giá cao.


Dấu chấm than cho các thư mục phù hợp với tôi!
Ivan Aracki

Câu trả lời:


128

Nếu bạn cần bỏ qua mọi thứ ngoại trừ một số thư mục hoặc tệp và cũng bỏ qua một số tệp không cần thiết bên trong các thư mục được phép đó, bạn có thể sử dụng .dockerignoretệp sau :

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db

8
Theo tài liệu Docker, chỉ đặt *trên dòng đầu tiên (thay vì **) là đủ. Trích dẫn: "bạn có thể muốn chỉ định tệp nào sẽ bao gồm trong ngữ cảnh, thay vì loại trừ tệp nào. Để đạt được điều này, hãy chỉ định *làm mẫu đầu tiên, tiếp theo là một hoặc nhiều !mẫu ngoại lệ".
Johnny Thunderman,

31

Từ tham chiếu dockerfile :

Ngoài các quy tắc filepath.Match của Go, Docker cũng hỗ trợ một chuỗi ký tự đại diện đặc biệt ** khớp với bất kỳ số lượng thư mục nào (kể cả số 0). Ví dụ: ** / *. Go sẽ loại trừ tất cả các tệp kết thúc bằng .go được tìm thấy trong tất cả các thư mục, bao gồm cả thư mục gốc của ngữ cảnh xây dựng.

Vì vậy, một dòng chỉ chứa ** sẽ bỏ qua mọi thứ trong cùng thư mục với Dockerfile.

Như mong đợi, dấu chấm than sau đó có thể được sử dụng để tham chiếu đến bất kỳ tệp nào bạn muốn gửi đến trình nền docker.


3
Điều cực kỳ quan trọng là **phải lên đầu tệp, nếu không các loại trừ sẽ bị bỏ qua. Docker sử dụng quy tắc cuối cùng phù hợp làm quy tắc "cuối cùng", vì vậy nếu **là quy tắc cuối cùng, nó sẽ khớp với mọi thứ.
tedivm

3
Vì vậy, hãy thêm **vào dòng đầu tiên và !footrên dòng tiếp theo nếu foolà tệp duy nhất bạn muốn đưa vào.
Saca

9

Điều này nghe có vẻ lạ, nhưng nếu tất cả những gì bạn cần là một tệp jar duy nhất, bạn có thể tạo một thư mục "docker" trong hệ thống xây dựng có chứa Dockerfile của bạn. Khi bạn chạy các bản dựng của mình, hãy yêu cầu các tập lệnh bản dựng sao chép tệp jar đơn vào "docker", sau đó thực thi bản dựng hình ảnh docker (từ bên trong thư mục "docker") và đẩy vào sổ đăng ký docker của bạn khi hoàn tất.


2
Hi, nghe không có gì lạ cả. Tôi nghĩ đó là một thông lệ chung, nhưng tôi đang tìm cách thực hiện với .dockerignore nếu có thể. Bên cạnh đó, tôi không thực sự thích xml mvn :)
Rowanto

Bạn có thể kết hợp cả hai cách tiếp cận bằng cách đặt tệp dockerfile vào một thư mục con và sử dụng .dockerignore. Theo các tài liệu, dù sao thì làm như vậy cũng tốt
Jonathan Lee

Tài liệu của Docker : Trong hầu hết các trường hợp, tốt nhất là bắt đầu với một thư mục trống làm ngữ cảnh và giữ Dockerfile của bạn trong thư mục đó. Chỉ thêm các tệp cần thiết để xây dựng Dockerfile. Cảnh báo: Không sử dụng thư mục gốc của bạn, /, làm PATH vì nó khiến bản dựng chuyển toàn bộ nội dung trong ổ cứng của bạn sang trình nền Docker.
Jonathan Lee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.