Dockerfile RUN,CMD,ENTRYPOINT命令區別


原文: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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM