Dockerfile中CMD和ENTRYPOINT的差別
在Dockerfile CMD是容器啟動時運作的指令,ENTERPOINT作用和CMD是類似的,那麼兩者有何差別呢?先上結論:
CMD在運作docker run指令時容易被覆寫,而ENTERPOINT不容易被覆寫
下面通過示例示範下來看兩者的差別?
Dockerfile
FROM alpine
CMD [ "/bin/echo","hello,world" ]
編譯之後運作,結果如下:
# docker build -t test-cmd .
# docker run test-cmd
hello,world
換下運作指令再來看:
# docker run test-cmd /bin/echo hello,code
hello,code
可以看到後面的
/bin/echo hello,code
替換掉了 CMD 中指定的指令。
再來看ENTRYPOINT
Dockerfile
FROM alpine
ENTRYPOINT [ "/bin/echo","hello,world"]
編譯之後運作,結果如下:
# docker build -t test-cmd .
# docker run test-cmd
hello,world
這裡可以看到 CMD 和 ENTRYPOINT作用其實是一緻的。
再将 CMD 和 ENTERYPOINT 組合在一起來看
Dockerfile
FROM alpine
ENTRYPOINT [ "/bin/echo"]
CMD [ "hello,world" ]
編譯之後運作:
# docker build -t test-cmd .
# docker run test-cmd
hello,world
這裡相當于運作了
/bin/echo hello,world
這個指令。
再次替換docker run的參數來看兩者的差別:
# docker run test-cmd hello,code
hello,code
我們在
docker run
後面添加了參數
hello,code
,相當于運作了
/bin/echo hello,code
,也就是用
hello,code
覆寫了CMD中的
hello,world
參數。
其實ENTRYPOINT也可以在docker run中添加參數來指定,隻不過麻煩點 要加 --entrypoint還是上面的
Dockerfile
編譯運作。在
docker run
指令中用
/bin/ls
替換掉了
ENTRYPOINT
中的
/bin/echo
,用/bin/替換掉了
CMD
中的
hello,world
。
# docker build -t test-cmd .
# docker run --entrypoint="/bin/ls" test-cmd /bin/
arch
ash
base64
bbconfig
busybox
cat
chgrp
chmod
chown
conspy
cp
date
dd
df
...
總結
的目的和
ENTRYPOINT
一樣,都是在指定容器啟動程式及參數。
CMD
在運作時也可以替代,不過比
ENTRYPOINT
要略顯繁瑣,需要通過
CMD
的參數
docker run
--entrypoint
來指定。
當指定了
後,
ENTRYPOINT
的含義就發生了改變,不再是直接的運作其指令,而是将
CMD
的内容作為參數傳給
CMD
ENTRYPOINT
指令,換句話說實際執行時,将變為:
<ENTRYPOINT> "<CMD>"
這樣做有什麼好處呢?
- 通過将 ENTRYPOINT 和 CMD 組合起來就可以靈活地在docker run的時候指定需要的參數。
- 容器啟動時可能需要做一些初始化的工作,那麼可以在 ENTRYPOINT 來做這些事情(比如運作一個腳本來做初始化),用CMD來啟動容器
- [1] <<第一本Docker書>>
- [2] <<Docker從入門到實踐>>