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 đó - ADDvà 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 ADDCOMMAND
Hãy bắt đầu bằng cách lưu ý rằng ADDlệnh cũ hơn COPY. Kể từ khi ra mắt nền tảng Docker, ADDhướ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 ADDlệ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
ADDcũ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 COPYCOMMAND
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ư ADDlệnh liên quan chặt chẽ của nó , COPYchỉ 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 COPYhướ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 đó COPYlệnh được đưa ra, rõ ràng là giữ ADDlà 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 COPYluô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 RUNlệ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.