Dockerfile RUN,CMD,ENTRYPOINT命令區(qū)別

Dockerfile中RUN,CMD和ENTRYPOINT都能夠用于執(zhí)行命令,下面是三者的主要用途:

  • RUN命令執(zhí)行命令并創(chuàng)建新的鏡像層,通常用于安裝軟件包
  • CMD命令設置容器啟動后默認執(zhí)行的命令及其參數(shù),但CMD設置的命令能夠被docker run命令后面的命令行參數(shù)替換
  • ENTRYPOINT配置容器啟動時的執(zhí)行命令(不會被忽略,一定會被執(zhí)行,即使運行 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 在當前鏡像的頂部執(zhí)行命令,并通過創(chuàng)建新的鏡像層。Dockerfile 中常常包含多個 RUN 指令。下面是一個例子:

RUN apt-get update && apt-get install -y \  
 bzr \
 cvs \
 git \
 mercurial \
 subversion

apt-get update 和 apt-get install 被放在一個 RUN 指令中執(zhí)行,這樣能夠保證每次安裝的是最新的包。如果 apt-get install 在單獨的 RUN 中執(zhí)行,則會使用 apt-get update 創(chuàng)建的鏡像層,而這一層可能是很久以前緩存的。

CMD命令

CMD 指令允許用戶指定容器的默認執(zhí)行的命令。此命令會在容器啟動且 docker run 沒有指定其他命令時運行。下面是一個例子:

CMD echo "Hello world"

運行容器 docker run -it [image] 將輸出:

Hello world

但當后面加上一個命令,比如 docker run -it [image] /bin/bash,CMD 會被忽略掉,命令 bash 將被執(zhí)行:

root@10a32dc7d3d3:/#

ENTRYPOINT命令

ENTRYPOINT 的 Exec 格式用于設置容器啟動時要執(zhí)行的命令及其參數(shù),同時可通過CMD命令或者命令行參數(shù)提供額外的參數(shù)。ENTRYPOINT 中的參數(shù)始終會被使用,這是與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 中的參數(shù)始終會被使用,而 CMD 的額外參數(shù)可以在容器啟動時動態(tài)替換掉。

總結

  • 使用 RUN 指令安裝應用和軟件包,構建鏡像。
  • 如果 Docker 鏡像的用途是運行應用程序或服務,比如運行一個 MySQL,應該優(yōu)先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可為 ENTRYPOINT 提供額外的默認參數(shù),同時可利用 docker run 命令行替換默認參數(shù)。
  • 如果想為容器設置默認的啟動命令,可使用 CMD 指令。用戶可在 docker run 命令行中替換此默認命令。

參考文章

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容