- ENTRYPOINT định nghĩa process sẽ được thực thi bên trong container
- CMD định nghĩa default arguments cung cấp cho entrypoint process.
Thông thường ENTRYPOINT sẽ định nghĩa path tới process sẽ được thực thi, CMD định nghĩa param (nếu có).
Mặc định không định nghĩa ENTRYPOINT, docker sẽ hiểu entry point là
/bin/sh -c
CMD – Khi nào dùng?
- Dùng để thiết lập lệnh mặc định khi container chạy.
- Có thể ghi đè khi chạy container bằng cách thêm lệnh sau cùng.
Ví dụ:
CMD ["npm", "start"]
docker run myimage ["npm", "run", "test"] # Ghi đè CMD
ENTRYPOINT – Khi nào dùng?
- Dùng để thiết lập một executable chính cho container.
- Mặc định sẽ không bị ghi đè, trừ khi dùng
-entrypoint.
ENTRYPOINT làm cho container có thể hoạt động như một command riêng biệt (executable).
Ví dụ:
ENTRYPOINT ["./bin/www"]
Dùng kết hợp ENTRYPOINT + CMD
- ENTRYPOINT: định nghĩa lệnh chính, ví dụ
./prometheus - CMD: cung cấp các flag hoặc tham số mặc định, ví dụ
-config.file=...
CMD sẽ được append vào ENTRYPOINT
Ví dụ với Prometheus
ENTRYPOINT ["/bin/prometheus"]
CMD ["--config.file=/etc/prometheus/prometheus.yml", "--storage.tsdb.path=/prometheus"]
Khi chạy:
docker run prom-image
sẽ thực hiện:
/bin/prometheus --config.file=... --storage.tsdb.path=...
Thực hành với Weather App
1. Tạo Dockerfile mới:
ENTRYPOINT ["./bin/www"]
2. Build image:
docker image build -t linuxacademy/weather-app:v4 .
3. Chạy container:
docker container run -d --name weather-app4 linuxacademy/weather-app:v4
4. Kiểm tra bằng docker container inspect weather-app4
- Không có `Cmd`, chỉ có `Entrypoint`
- `Args` chứa `["-c", "./bin/www"]`
5. Append thêm command:
docker container run --name weather-app5 linuxacademy/weather-app:v4 echo hello world
hello world được thêm vào cuối entrypoint
Ví dụ thực tế: Prometheus
1. Tạo 2 volume:
docker volume create prometheus-conf
docker volume create prometheus-data
2. Gán quyền nobody (UID 65534):
sudo chown -R 65534:65534 /var/lib/docker/volumes/prometheus-*/_data
3. Run container với volume và flags:
docker container run -d --name prometheus \
-v prometheus-conf:/etc/prometheus \
-v prometheus-data:/prometheus \
prom/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/prometheus
4. Inspect:
docker container inspect prometheus
Thấy Path: /bin/prometheus, Args: là các flags được thêm vào
Tóm tắt
| Thành phần | CMD | ENTRYPOINT |
|---|---|---|
| Ghi đè được? | Có thể ghi đè qua CLI | Không (trừ khi dùng --entrypoint) |
| Vai trò | Thiết lập lệnh mặc định | Thiết lập command chính cho container |
| Thường dùng | Tùy biến, linh hoạt | Khi container cần cố định behavior |
| Kết hợp | Với ENTRYPOINT để thêm tham số | Gọi command chính (executable) |