Dockerfile 有兩個啟動配置, CMD 和 ENTRYPOINT , 可以在 Dockerfile 中來配置容器啟動時自動執行的命令, 但是這二者有什么區別呢, 接下來總結如下:
首先來看一下 CMD , 有三種格式的配置, 分別是:
- CMD [“executable”,“param1”,“param2”] (exec 格式, 推薦的格式)
- CMD [“param1”,“param2”] (作為 ENTRYPOINT 的默認參數)
- CMD command param1 param2 (shell 格式)
在使用時, 要注意一下問題:
- 包含可執行文件時, 為容器指定默認執行命令, 這個是主要用途;
- 不包含可執行文件時, 必須提供 ENTRYPOINT 配置, CMD 作為默認參數;
- Dockerfile 中只能有一個 CMD 起效, 如果出現了多個, 則最后一個起效;
而 ENTRYPOINT , 有兩種格式的配置, 分別是:
- ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式, 推薦)
- ENTRYPOINT command param1 param2 (shell 格式)
CMD 和 ENTRYPOINT 兩種配置格式的區別是:
exec 格式 推薦這種格式, 使用這種模式時, 可以不需要 shell 進程, 讓 Docker 應用的可執行程序成為容器的 PID 1 進程, 可以接收 Unix 信號, 比如執行 docker stop <container style="box-sizing: border-box;">時能夠接收到 SIGTERM。</container>
shell 格式 會始終調用一個 shell 進程, 成為 /bin/sh -c 的子命令, 可執行程序不能響應 Unix 信號。
注意: ENTRYPOINT 使用 shell 格式 時, 會忽略 CMD 和 run 傳入的參數, 如果要替換默認的 ENTRYPOINT 命令, 則需要在執行 docker run 的時候指定
--entrypoint
參數。
當 CMD 和 ENTRYPOINT 的使用總結如下:
在 Dockerfile 中, 應該至少指定一個 CMD 和 ENTRYPOINT;
將 Docker 當作可執行程序時, 應該使用 ENTRYPOINT 進行配置;
CMD 可以用作 ENTRYPOINT 默認參數, 或者用作 Docker 的默認命令;
CMD 可以被 docker run 傳入的參數覆蓋;
docker run 傳入的參數會附加到 ENTRYPOINT 之后, 前提是使用了 exec 格式 。
最后我們來看一個實例:
ENTRYPOINT 使用 exec 格式, ENTRYPOINT 中的參數始終會被使用,而 CMD 的額外參數可以在容器啟動時動態替換掉。
比如下面的 Dockerfile 片段:
當容器通過 docker run -it [image]
啟動時,輸出為:
而如果通過 docker run -it [image] CloudMan
啟動,則輸出為:
參考文檔
http://www.google.com
http://t.cn/Rn2s509
http://t.cn/Rn2s7gM