SAO CHÉP với docker nhưng loại trừ


231

Trong Dockerfile, tôi có

COPY . .

Tôi muốn loại trừ toàn bộ thư mục, trong trường hợp của tôi, thư mục node_modules.

Một cái gì đó như thế này:

   COPY [all but **/node_modules/**] .

Điều này có thể với Docker?


23

Tôi đang tìm câu trả lời cho câu hỏi liên quan này: stackoverflow.com/questions/50547361/ trên
Alexander Mills

Câu trả lời:


377

Tạo tập tin .dockerignoretrong thư mục bối cảnh xây dựng docker của bạn (vì vậy trong trường hợp này, rất có thể là một thư mục là cha mẹ của node_modules) với một dòng trong đó:

**/node_modules

mặc dù bạn có thể chỉ muốn:

node_modules

Thông tin về dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file


5
cảm ơn, vì vậy "BẢN SAO .." lệnh không cần thay đổi, tôi đoán
Alexander Mills

Không thực sự : /config/nginx/ /config/logstash/, tôi tìm thấy điều này trong bash container:ls config/ gunicorn logs logstash nginx
SalahAdDin

3
@SalahAdDin vì lý do tương tự bạn không viết ls /config/, bạn đã thử thêm các đường dẫn đó vào .dockerignore của mình mà không dẫn đầu /chưa?
Pablo

8
Chỉ node_moduleskhông làm việc trong thư mục con.
rustyx

5
Điều này không thực sự giải quyết được vấn đề nếu bạn muốn có nó SAO CHÉP nhưng chỉ không ở trong lớp đó ...
Wes

33

Đối với những người không thể sử dụng tệp .dockerignore (ví dụ: nếu bạn cần tệp trong một BẢN SAO chứ không phải tệp khác):

Có, nhưng bạn cần nhiều hướng dẫn SAO CHÉP. Cụ thể, bạn cần một BẢN SAO cho mỗi chữ cái trong tên tệp bạn muốn loại trừ.

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

Tiếp tục cho đến khi bạn có tên tệp đầy đủ hoặc chỉ là tiền tố bạn chắc chắn sẽ không có bất kỳ tệp nào khác.


1
Điều này sẽ không bị hủy vì bạn sẽ nhận được COPY failed: no source files were specifiedkhi không có tệp nào bắt đầu bằng 'không', nhưng không phải 'gật đầu'.
mheck

1
Ngoài ra, bạn có thể sử dụng hai thư mục con khác nhau (cho các mục tiêu sao chép khác nhau), do đó, ví dụ như trong thiết lập nginx của tôi, tôi sẽ phải src/đến /var/www/conf/nginx.confđi đến /etc/nginx/conf.d/default.conf. Ngoài ra, bạn có thể sao chép mọi thứ và RUN rm -r confsau đó (giữ nguyên cây nguồn như cũ). Tôi muốn nghe nếu ai đó có một đề nghị khác.
Yuval

1
Điều gì sẽ là một giải pháp cho các loại tệp cụ thể hoặc kết thúc tệp nếu tôi sẽ làm như thế này?
Lea Reimann

Nhược điểm duy nhất của phương pháp này là cấu trúc thư mục của bạn bị san phẳng
Hồi giáo Q.

Nếu bạn chỉ có một vài thư mục sẽ được sao chép (chỉ nói '/ app' hoặc '/ src'). Một cách đơn giản hơn là sao chép các thư mục riêng lẻ (để giữ cấu trúc của chúng) và sau đó bạn chỉ cần một COPY [^node_modules]*bản sao để sao chép tất cả các tệp cấp cao nhất.
smdufb

9

Trong trường hợp của tôi, Dockerfile của tôi có một bước cài đặt, nó tạo ra vendorthư mục (tương đương với PHP node_modules). Tôi sau đó COPYthư mục này đến hình ảnh ứng dụng cuối cùng. Vì vậy, tôi không thể đặt vendortrong của tôi .dockerignore. Giải pháp của tôi chỉ đơn giản là xóa thư mục trước khi thực hiện composer install(tương đương với PHP npm install).

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
    && composer install 

FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .

Giải pháp này hoạt động và không làm mờ hình ảnh cuối cùng, nhưng nó không lý tưởng, vì vendorthư mục trên máy chủ được sao chép vào bối cảnh Docker trong quá trình xây dựng, làm tăng thêm thời gian.


3
Lưu ý chắc chắn lý do tại sao bạn phải loại bỏ composer.locktrước composer install. Nếu không có tệp khóa, một bộ phụ thuộc khác (thư mục nhà cung cấp) có thể được cài đặt khi bạn xây dựng lần sau.
Lacek

1
@Lacek: Bạn nói đúng. Tôi đã học tốt hơn kể từ khi tôi đăng bài này.
Cameron Hudson

1
@CameronHudson có thể cập nhật câu trả lời ban đầu của bạn trước khi mọi người sao chép / dán thực hành xấu này.
Robin van Baalen

2

Thêm .dockerignore hoạt động cho tôi. Thêm một điểm nữa Những người đang thử giải pháp này trên Windows , windows sẽ không cho phép bạn tạo tệp .dockerignore (vì mặc định nó không cho phép tạo tệp bắt đầu bằng.)

Để tạo tập tin như vậy bắt đầu với. trên Windows , bao gồm cả dấu chấm kết thúc, như: .dockerignore.và nhấn enter (miễn là bạn đã bật tùy chọn tiện ích mở rộng từ tùy chọn thư mục)


6
Bạn có thể tạo một tệp trong các cửa sổ bắt đầu bằng một dấu chấm bằng cách kết thúc nó bằng một dấu chấm.
Jim Pedid

0

Loại trừ node_modules khỏi thư mục hiện tại

node_modules

Không bao gồm node_modules trong bất kỳ thư mục con trực tiếp nào

*/node_modules

Đây là tài liệu chính thức

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.