原文:https://www.jianshu.com/p/f0a0f6a43907
Dockerfile中RUN,CMD和ENTRYPOINT都能夠用於執行命令,下面是三者的主要用途:
- RUN命令執行命令並創建新的鏡像層,通常用於安裝軟件包
- CMD命令設置容器啟動后默認執行的命令及其參數,但CMD設置的命令能夠被
docker run命令后面的命令行參數替換 - ENTRYPOINT配置容器啟動時的執行命令(不會被忽略,一定會被執行,即使運行
docker run時指定了其他命令)
Shell格式和Exec格式運行命令
我們可用兩種方式指定 RUN、CMD 和 ENTRYPOINT 要運行的命令:Shell 格式和 Exec 格式:
- Shell格式:<instruction> <command>。例如:apt-get install python3
- Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]
CMD 和 ENTRYPOINT 推薦使用 Exec 格式,因為指令可讀性更強,更容易理解。RUN 則兩種格式都可以。
Run命令
RUN 指令通常用於安裝應用和軟件包。RUN 在當前鏡像的頂部執行命令,並通過創建新的鏡像層。Dockerfile 中常常包含多個 RUN 指令。下面是一個例子:
RUN apt-get update && apt-get install -y \ bzr \ cvs \ git \ mercurial \ subversion
apt-get update 和 apt-get install 被放在一個 RUN 指令中執行,這樣能夠保證每次安裝的是最新的包。如果 apt-get install 在單獨的 RUN 中執行,則會使用 apt-get update 創建的鏡像層,而這一層可能是很久以前緩存的。
CMD命令
CMD 指令允許用戶指定容器的默認執行的命令。此命令會在容器啟動且 docker run 沒有指定其他命令時運行。下面是一個例子:
CMD echo "Hello world"
運行容器 docker run -it [image] 將輸出:
Hello world
但當后面加上一個命令,比如 docker run -it [image] /bin/bash,CMD 會被忽略掉,命令 bash 將被執行:
root@10a32dc7d3d3:/#
ENTRYPOINT命令
ENTRYPOINT 的 Exec 格式用於設置容器啟動時要執行的命令及其參數,同時可通過CMD命令或者命令行參數提供額外的參數。ENTRYPOINT 中的參數始終會被使用,這是與CMD命令不同的一點。下面是一個例子:
ENTRYPOINT ["/bin/echo", "Hello"]
當容器通過 docker run -it [image] 啟動時,輸出為:
Hello
而如果通過 docker run -it [image] CloudMan 啟動,則輸出為:
Hello CloudMan
將Dockerfile修改為:
ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"]
當容器通過 docker run -it [image] 啟動時,輸出為:
Hello world
而如果通過 docker run -it [image] CloudMan 啟動,輸出依舊為:
Hello CloudMan
ENTRYPOINT 中的參數始終會被使用,而 CMD 的額外參數可以在容器啟動時動態替換掉。
總結
- 使用 RUN 指令安裝應用和軟件包,構建鏡像。
- 如果 Docker 鏡像的用途是運行應用程序或服務,比如運行一個 MySQL,應該優先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可為 ENTRYPOINT 提供額外的默認參數,同時可利用 docker run 命令行替換默認參數。
- 如果想為容器設置默認的啟動命令,可使用 CMD 指令。用戶可在 docker run 命令行中替換此默認命令。
參考文章
作者:伊凡的一天
鏈接:https://www.jianshu.com/p/f0a0f6a43907
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
