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: COPYADD. 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:

ADD archive.tar.gz /app/

Đặ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:

ADD archive.tar.gz /app/

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 COPYADD 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

COPY myfile.txt /app/

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 COPYADD 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.