Trong quá trình tạo Dockerfile để xây dựng Docker image, việc sao chép tệp từ máy chủ (host) vào Docker image là một tác vụ rất phổ biến. Docker cung cấp hai lệnh chính để thực hiện điều này: COPY
và ADD
. Mặc dù chúng có vẻ giống nhau về mục đích, nhưng có một số khác biệt quan trọng mà bạn nên hiểu rõ để sử dụng chúng một cách hiệu quả và đúng đắn.
Lệnh COPY trong Dockerfile
COPY
là lệnh đơn giản nhất và được khuyến nghị sử dụng trong đa số các trường hợp khi bạn chỉ cần sao chép các tệp hoặc thư mục từ hệ thống máy chủ (host) vào Docker image.
Cách sử dụng lệnh COPY
Cú pháp của lệnh COPY
rất đơn giản:
COPY <source> <destination>
Trong đó:
- source: Đường dẫn của tệp hoặc thư mục trên máy chủ.
- destination: Đường dẫn trong Docker image nơi tệp hoặc thư mục sẽ được sao chép tới.
Ví dụ, sao chép một tệp index.html
từ thư mục hiện tại trên máy chủ vào thư mục /usr/share/nginx/html/
trong Docker image:
COPY index.html /usr/share/nginx/html/
Đặc điểm của lệnh COPY
- Chỉ sao chép tệp và thư mục:
COPY
chỉ thực hiện chức năng đơn giản là sao chép tệp và thư mục từ máy chủ vào Docker image mà không có bất kỳ thay đổi nào khác.
- Không hỗ trợ URL:
COPY
chỉ sao chép dữ liệu từ hệ thống tệp cục bộ (local file system) mà không thể tải dữ liệu từ URL.
- Tính đơn giản và nhanh chóng:
COPY
được tối ưu hóa để chỉ sao chép các tệp một cách đơn giản, không có bất kỳ chức năng bổ sung nào.
Lệnh ADD trong Dockerfile
Lệnh ADD
cũng được sử dụng để sao chép tệp và thư mục vào Docker image, nhưng nó có thêm một số tính năng bổ sung, đặc biệt là việc giải nén tệp nén và tải tệp từ URL.
Cách sử dụng lệnh ADD
Cú pháp của lệnh ADD
giống với COPY
:
ADD <source> <destination>
Ví dụ, sao chép một tệp archive.tar.gz
từ thư mục hiện tại và tự động giải nén vào /app/
trong Docker image:
Đặc điểm của lệnh ADD
Giải nén tự động các tệp nén: ADD
có khả năng tự động giải nén các tệp nén dạng .tar
, .tar.gz
, .tar.bz2
, v.v., nếu chúng được sao chép vào Docker image. Điều này giúp tự động hóa quá trình giải nén trong khi xây dựng image.
Ví dụ, khi bạn sao chép một tệp archive.tar.gz
:
Docker sẽ tự động giải nén tệp archive.tar.gz
vào thư mục /app/
trong image.
Hỗ trợ URL: ADD
cho phép bạn tải tệp từ URL trực tiếp và sao chép nó vào Docker image.
Ví dụ, tải một tệp từ Internet và sao chép vào thư mục /app
:
ADD http://example.com/file.zip /app/
Lưu ý rằng Docker không tự động giải nén tệp nén khi tải từ URL.
Phạm vi rộng hơn: So với COPY
, lệnh ADD
có khả năng làm việc với cả URL và các tệp nén, làm cho nó linh hoạt hơn nhưng cũng có thể tạo ra sự không cần thiết hoặc không rõ ràng trong quá trình sử dụng.
Khi nào nên sử dụng COPY và ADD?
Việc lựa chọn giữa COPY
và ADD
phụ thuộc vào nhu cầu cụ thể của bạn:
- Sử dụng
COPY
khi bạn chỉ cần sao chép tệp hoặc thư mục: COPY
nên được sử dụng trong đa số trường hợp, khi bạn không cần thêm bất kỳ chức năng bổ sung nào như giải nén hoặc tải từ URL. COPY
đơn giản và dễ hiểu, giúp Dockerfile rõ ràng và tối ưu hơn.
- Sử dụng
ADD
khi bạn cần tải tệp từ URL hoặc giải nén tệp: Nếu bạn có một tệp nén cần được giải nén tự động trong quá trình xây dựng Docker image, hoặc bạn cần tải tệp từ Internet, thì ADD
sẽ là lựa chọn thích hợp.
Một số ví dụ so sánh
Sử dụng COPY để sao chép tệp
Lệnh này chỉ sao chép tệp myfile.txt
từ hệ thống máy chủ vào thư mục /app/
trong Docker image.
Sử dụng ADD để giải nén tệp nén
ADD myarchive.tar.gz /app/
Lệnh này sẽ sao chép và tự động giải nén tệp myarchive.tar.gz
vào thư mục /app/
trong Docker image.
Sử dụng ADD để tải tệp từ URL
ADD http://example.com/file.zip /app/
Lệnh này sẽ tải tệp file.zip
từ URL và lưu vào thư mục /app/
trong Docker image mà không giải nén.
Kết luận
Sự khác biệt chính giữa COPY
và ADD
nằm ở chức năng bổ sung mà ADD
cung cấp, bao gồm giải nén tự động và tải tệp từ URL. Trong đa số trường hợp, bạn nên sử dụng COPY
vì nó đơn giản và tối ưu hơn. Chỉ khi bạn thực sự cần tính năng giải nén hoặc tải từ URL, ADD
mới là lựa chọn phù hợp. Hiểu rõ cách hoạt động của từng lệnh sẽ giúp bạn xây dựng Dockerfile một cách hiệu quả hơn và tránh những rủi ro tiềm ẩn liên quan đến việc sử dụng các tính năng không cần thiết.