簡介
Dockerfile 裡的 CMD 和 ENTRYPOINT 都能設定容器啟動時要執行的指令。
但很多人分不清「誰先誰後」、「哪個會被覆蓋」? 這篇文章用最簡單的例子帶你搞懂。
一、CMD 是什麼?
CMD 用來設定容器預設執行的命令。
如果在執行容器時有額外指定命令,CMD 會被覆蓋。
範例:
FROM ubuntu執行:
CMD ["echo", "Hello from CMD"]
docker run myimage
# 輸出:Hello from CMD
但如果你執行:
docker run myimage echo "Hi"
# 輸出:Hi
CMD 被你覆蓋了。
二、ENTRYPOINT 是什麼?
ENTRYPOINT 代表容器啟動時一定會執行的主命令。
即使你在 docker run 時加了參數,也只是「附加」到它後面。
範例:
FROM ubuntu
ENTRYPOINT ["echo", "Hello"]
執行:
docker run myimage world
# 輸出:Hello world
這裡的 world 是傳給 ENTRYPOINT 的參數。
三、CMD + ENTRYPOINT 一起用
它們可以搭配使用,常見寫法如下:
FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello world"]
執行:
docker run myimage
# 輸出:Hello world
執行:
docker run myimage Bye
# 輸出:Bye
解釋:
ENTRYPOINT固定主命令。CMD提供預設參數(可被覆蓋)。
四、Shell form vs Exec form 的搭配要注意
ENTRYPOINT 和 CMD 都可以用 Shell form 或 Exec form。
但在正式環境建議:
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8080"]
這樣訊號傳遞會正確。
如果用 Shell form 反而會吃掉訊號。
五、CMD 與 ENTRYPOINT 的核心差異
可以這樣想:
- ENTRYPOINT:主程式(這個容器要「做什麼」)
- CMD:預設參數(這個程式「怎麼做」)

結語
簡單來說:
CMD是「預設要做什麼」ENTRYPOINT是「一定要做什麼」
搭配得好,能讓你的 Dockerfile 更靈活又專業。
下次寫 Dockerfile,不妨試著組合這兩者,讓容器啟動行為完全符合你的設計。





