Lệnh ENTRYPOINTchỉ định một lệnh sẽ luôn được thực thi khi container bắt đầu.
Các CMDđối số chỉ định sẽ được đưa đến ENTRYPOINT.
Nếu bạn muốn tạo một hình ảnh dành riêng cho một lệnh cụ thể, bạn sẽ sử dụng ENTRYPOINT ["/path/dedicated_command"]
Mặt khác, nếu bạn muốn tạo một hình ảnh cho mục đích chung, bạn có thể để lại ENTRYPOINTkhông xác định và sử dụng CMD ["/path/dedicated_command"]vì bạn sẽ có thể ghi đè cài đặt bằng cách cung cấp đối số docker run.
Ví dụ: nếu Dockerfile của bạn là:
FROM debian:wheezy
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]
Chạy hình ảnh mà không có bất kỳ đối số sẽ ping địa phương:
$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.096 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.088 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.088/0.091/0.096/0.000 ms
Bây giờ, chạy hình ảnh với một đối số sẽ ping đối số:
$ docker run -it test google.com
PING google.com (173.194.45.70): 48 data bytes
56 bytes from 173.194.45.70: icmp_seq=0 ttl=55 time=32.583 ms
56 bytes from 173.194.45.70: icmp_seq=2 ttl=55 time=30.327 ms
56 bytes from 173.194.45.70: icmp_seq=4 ttl=55 time=46.379 ms
^C--- google.com ping statistics ---
5 packets transmitted, 3 packets received, 40% packet loss
round-trip min/avg/max/stddev = 30.327/36.430/46.379/7.095 ms
Để so sánh, nếu Dockerfile của bạn là:
FROM debian:wheezy
CMD ["/bin/ping", "localhost"]
Chạy hình ảnh mà không có bất kỳ đối số sẽ ping địa phương:
$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.087 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.090 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.076/0.084/0.090/0.000 ms
Nhưng chạy hình ảnh với một đối số sẽ chạy đối số:
docker run -it test bash
root@e8bb7249b843:/#
Xem bài viết này từ Brian De Hamer để biết thêm chi tiết:
https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/