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?
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?
Câu trả lời:
Tạo tập tin .dockerignore
trong 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
/config/nginx/ /config/logstash/
, tôi tìm thấy điều này trong bash container:ls config/ gunicorn logs logstash nginx
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?
node_modules
không làm việc trong thư mục con.
Đố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.
COPY failed: no source files were specified
khi không có tệp nào bắt đầu bằng 'không', nhưng không phải 'gật đầu'.
src/
đến /var/www
và /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 conf
sau đó (giữ nguyên cây nguồn như cũ). Tôi muốn nghe nếu ai đó có một đề nghị khác.
COPY [^node_modules]*
bản sao để sao chép tất cả các tệp cấp cao nhất.
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 vendor
thư mục (tương đương với PHP node_modules
). Tôi sau đó COPY
thư mục này đến hình ảnh ứng dụng cuối cùng. Vì vậy, tôi không thể đặt vendor
trong 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ì vendor
thư 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.
composer.lock
trướ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.
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)
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
.dockerignore
?