Khi tạo Dockerfile, có hai lệnh mà bạn có thể sử dụng để sao chép tệp / thư mục vào đó - ADD
và COPY
. Mặc dù có sự khác biệt nhỏ trong phạm vi chức năng của chúng, về cơ bản chúng thực hiện cùng một nhiệm vụ.
Vậy, tại sao chúng ta có hai lệnh và làm thế nào để biết khi nào nên sử dụng lệnh này hay lệnh kia?
Docker ADD
COMMAND
Hãy bắt đầu bằng cách lưu ý rằng ADD
lệnh cũ hơn COPY
. Kể từ khi ra mắt nền tảng Docker, ADD
hướng dẫn đã là một phần trong danh sách các lệnh của nó.
Lệnh sao chép tệp / thư mục vào một hệ thống tệp của vùng chứa được chỉ định.
Cú pháp cơ bản của ADD
lệnh là:
ADD <src> … <dest>
Nó bao gồm nguồn bạn muốn sao chép ( <src>
) theo sau là đích bạn muốn lưu trữ ( <dest>
). Nếu nguồn là một thư mục,ADD
sao chép mọi thứ bên trong nó (bao gồm siêu dữ liệu hệ thống tệp).
Ví dụ: nếu tệp có sẵn cục bộ và bạn muốn thêm nó vào thư mục của một hình ảnh, bạn gõ:
ADD /source/file/path /destination/path
ADD
cũng có thể sao chép các tập tin từ một URL. Nó có thể tải xuống một tập tin bên ngoài và sao chép nó đến đích mong muốn. Ví dụ:
ADD http://source.file/url /destination/path
Một tính năng bổ sung là nó sao chép các tệp nén, tự động trích xuất nội dung ở đích đã cho. Tính năng này chỉ áp dụng cho các tệp / thư mục nén được lưu trữ cục bộ.
ADD source.file.tar.gz /temp
Hãy nhớ rằng bạn không thể tải xuống và trích xuất một tập tin / thư mục nén từ một URL. Lệnh không giải nén các gói bên ngoài khi sao chép chúng vào hệ thống tệp cục bộ.
DOCKER COPY
COMMAND
Do một số vấn đề về chức năng, Docker đã phải giới thiệu một lệnh bổ sung để sao chép nội dung - COPY
.
Không giống như ADD
lệnh liên quan chặt chẽ của nó , COPY
chỉ có một chức năng được gán. Vai trò của nó là sao chép các tập tin / thư mục ở một vị trí được chỉ định theo định dạng hiện có của chúng. Điều này có nghĩa là nó không giải quyết được việc trích xuất một tệp nén mà thay vào đó là sao chép nó.
Hướng dẫn chỉ có thể được sử dụng cho các tệp được lưu trữ cục bộ. Do đó, bạn không thể sử dụng nó với các URL để sao chép các tệp bên ngoài vào thùng chứa của bạn.
Để sử dụng COPY
hướng dẫn, hãy làm theo định dạng lệnh cơ bản:
Nhập nguồn và nơi bạn muốn lệnh trích xuất nội dung như sau:
COPY <src> … <dest>
Ví dụ:
COPY /source/file/path /destination/path
Sử dụng lệnh nào? (Thực hành tốt nhất)
Xem xét các trường hợp trong đó COPY
lệnh được đưa ra, rõ ràng là giữ ADD
là một vấn đề cần thiết. Docker đã phát hành một tài liệu chính thức phác thảo các thực tiễn tốt nhất để viết Dockerfiles, trong đó khuyên rõ ràng không nên sử dụngADD
lệnh.
Tài liệu chính thức của Docker COPY
luôn luôn phải là hướng dẫn sử dụng vì nó minh bạch hơn ADD
.
Nếu bạn cần sao chép từ bối cảnh xây dựng cục bộ vào một thùng chứa, hãy sử dụng COPY
.
Nhóm Docker cũng không khuyến khích sử dụng ADD
để tải xuống và sao chép gói từ URL. Thay vào đó, sẽ an toàn và hiệu quả hơn khi sử dụng wget hoặc curl trong một RUN
lệnh. Bằng cách đó, bạn tránh tạo ra một lớp hình ảnh bổ sung và tiết kiệm không gian.