Trong Docker, CMDENTRYPOINT là hai chỉ thị được sử dụng trong Dockerfile để xác định lệnh mà container sẽ thực thi khi khởi động. Tuy nhiên, chúng có cách hoạt động và mục đích khác nhau. Bài viết này sẽ giải thích chi tiết sự khác biệt giữa hai chỉ thị này và cách sử dụng chúng một cách hiệu quả.

1. Định Nghĩa CMD và ENTRYPOINT

1.1. CMD

  • Mục đích: CMD được sử dụng để chỉ định lệnh mặc định mà container sẽ chạy khi không có lệnh nào khác được cung cấp.
  • Cú pháp: Có ba cách để sử dụng CMD:
    • Cách 1: Cung cấp lệnh và tham số dưới dạng chuỗi.
    • Cách 2: Sử dụng mảng.
    • Cách 3: Sử dụng lệnh shell.

Ví dụ về cách sử dụng CMD:

CMD ["nginx", "-g", "daemon off;"]

1.2. ENTRYPOINT

  • Mục đích: ENTRYPOINT được sử dụng để xác định lệnh chính mà container sẽ chạy, với khả năng không bị ghi đè bởi các tham số. Điều này có nghĩa là bất kỳ lệnh nào được cung cấp khi chạy container sẽ được truyền đến lệnh trong ENTRYPOINT.
  • Cú pháp: Tương tự như CMD, ENTRYPOINT cũng có thể được sử dụng với chuỗi hoặc mảng.

Ví dụ về cách sử dụng ENTRYPOINT:

ENTRYPOINT ["nginx"]

2. Sự Khác Biệt Chính

2.1. Ghi Đè Lệnh

  • CMD: Có thể bị ghi đè khi bạn chỉ định lệnh khi chạy container.
docker run myimage echo "Hello World"

Khi đó, lệnh echo "Hello World" sẽ được thực thi thay vì lệnh được chỉ định trong CMD.

  • ENTRYPOINT: Không bị ghi đè. Nếu bạn chỉ định một lệnh khi chạy container, nó sẽ được thêm vào lệnh được chỉ định trong ENTRYPOINT.
docker run myimage "Hello World"

Lệnh thực thi sẽ là nginx "Hello World".

2.2. Mục Đích Sử Dụng

  • CMD: Thích hợp để cung cấp các tham số mặc định cho lệnh chính trong ENTRYPOINT hoặc để chỉ định lệnh mặc định khi không có lệnh nào được cung cấp.
  • ENTRYPOINT: Thích hợp để xác định lệnh chính mà container cần thực thi và luôn đảm bảo rằng lệnh đó sẽ được chạy.

3. Kết Hợp CMD và ENTRYPOINT

Bạn có thể sử dụng cả hai chỉ thị trong cùng một Dockerfile để có được chức năng tối ưu. Ví dụ:

ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]

Khi chạy container, lệnh sẽ là nginx -g daemon off;. Nếu bạn muốn thay đổi tham số, bạn chỉ cần cung cấp tham số mới:

docker run myimage "-g daemon on;"

Lệnh thực thi sẽ là nginx -g daemon on;.

4. Kết Luận

Sự khác biệt giữa CMDENTRYPOINT rất quan trọng trong việc thiết kế Dockerfile. Việc hiểu rõ cách hoạt động của chúng sẽ giúp bạn tạo ra các container có khả năng tùy biến cao và dễ dàng quản lý.