Làm cách nào để sao chép nhiều tệp trong một lớp bằng Dockerfile?


245

Sau đây Dockerfilecó bốn COPYlớp:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

Làm thế nào để sao chép các tập tin này bằng cách sử dụng một lớp thay thế? Sau đây đã được thử:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]

Câu trả lời:


427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

hoặc là

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

Bạn cũng có thể sử dụng các ký tự đại diện trong đặc tả nguồn. Xem các tài liệu để biết thêm chi tiết .

Thư mục thật đặc biệt! Nếu bạn viết

COPY dir1 dir2 ./

mà thực sự hoạt động như

COPY dir1/* dir2/* ./

Nếu bạn muốn sao chép nhiều thư mục (không phải nội dung của chúng) trong một thư mục đích trong một lệnh, bạn sẽ cần thiết lập bối cảnh xây dựng để các thư mục nguồn của bạn nằm dưới cha mẹ chung và sau đó COPYlà cha mẹ đó.


53
Lưu ý rằng nếu các nguồn là thư mục, điều này sao chép nội dung thư mục , không phải chính các thư mục.
Claudiu

7
Cũng lưu ý rằng thư mục đích là như nhau. Nếu bạn thực hiện rất nhiều tệp khác nhau với các đích khác nhau, thì bạn có thể muốn xem xét việc xây dựng một hệ thống tệp lớp phủ (như chroot), sau đó chuyển tartệp đó thành tệp lưu trữ và thêm nó bằng ADD.
tu-Tái lập Monica-dor duh

4
@Claudiu Làm thế nào để tự sao chép các thư mục?
k0pernikus

5
@ k0pernikus bạn có thể nói SAO CHÉP myDir1 ./MyDir1/
Manuel Manhart

@ manuel-manhart Có ai biết liệu chúng ta có thể tham số hóa danh sách các tệp bằng cách sử dụng Tham số Xây dựng không? github.com/moby/moby/issues/38532 ?
Marcello de Sales

52
COPY <all> <the> <things> <last-arg-is-destination>

Nhưng đây là một đoạn trích quan trọng từ các tài liệu:

Nếu bạn có nhiều bước Dockerfile sử dụng các tệp khác nhau từ ngữ cảnh của bạn, hãy sao chép chúng riêng lẻ, thay vì tất cả cùng một lúc. Điều này đảm bảo rằng bộ đệm xây dựng của mỗi bước chỉ bị vô hiệu (buộc bước này phải chạy lại) nếu các tệp được yêu cầu cụ thể thay đổi.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy


Bạn có biết nếu chúng ta có thể tham số hóa "tất cả mọi thứ" ??? Sử dụng tham số xây dựng? github.com/moby/moby/issues/38532 ???
Marcello de Sales

@MarcellodeSales không chắc tại sao bạn lại cần điều đó. Tại sao bạn không tạo một hình ảnh cơ sở mà không có các tệp này và sau đó các hình ảnh con có hướng dẫn sao chép trong đó - nếu chúng cần xác định đường dẫn dù sao nó cũng không tạo ra nhiều khác biệt. Hoặc bạn có thể loại bỏ hoàn toàn hình ảnh và gắn nó vào thùng chứa - ở đó bạn có các tệp .env để có cấu hình này.
Manuel Manhart

Ngoài ra, bạn luôn có thể sao chép trên một đường dẫn hiện có, vì hệ thống tệp được xếp lớp, nó sẽ chồng lấp / phủ bóng nội dung hiện có trước đó.
Manuel Manhart

@ManuelManhart, tôi đang xây dựng một hình ảnh tham số động với SAO CHÉP ONBUILD ... Là một phần của Nền tảng, tôi đang che giấu sự phức tạp của những gì cần được thực hiện trong hình ảnh, vì vậy, đó là lý do tại sao tôi cần cung cấp các giá trị như một tham số.
Marcello de Sales

@MarcellodeSales Tôi không nghĩ rằng điều này được hỗ trợ ngay bây giờ / chưa. Nhưng bạn có thể sử dụng các đối số xây dựng để đóng gói nó, xem stackoverflow.com/questions/43654656/
mẹo

7

đơn giản

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

từ tài liệu

Nếu nhiều tài nguyên được chỉ định, trực tiếp hoặc do sử dụng ký tự đại diện, thì phải là một thư mục và nó phải kết thúc bằng dấu gạch chéo /.


6

Điều đáng nói là bạn cũng có thể tạo một .dockerignoretệp để loại trừ các tệp mà bạn không muốn sao chép:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

Trước khi docker CLI gửi bối cảnh đến daemon docker, nó tìm kiếm một tệp có tên .dockerignore trong thư mục gốc của bối cảnh. Nếu tệp này tồn tại, CLI sẽ sửa đổi bối cảnh để loại trừ các tệp và thư mục khớp với các mẫu trong đó. Điều này giúp tránh việc gửi các tệp và thư mục lớn hoặc nhạy cảm đến daemon một cách không cần thiết và có khả năng thêm chúng vào hình ảnh bằng cách sử dụng THÊM hoặc SAO CHÉP.

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.