如何理解Dockerfile指令中的RUN和CMD及ENTRYPOINT

本篇文章給大家分享的是有關(guān)如何理解Dockerfile 指令中的RUN和CMD及ENTRYPOINT,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)建站科技有限公司專業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供綿陽電信機房機柜租用高防服務(wù)器,成都IDC機房托管,成都主機托管等互聯(lián)網(wǎng)服務(wù)。

RUN、CMD 和 ENTRYPOINT 這三個 Dockerfile 指令看上去很類似,很容易混淆。小編將通過實踐詳細(xì)討論它們的區(qū)別。

簡單的說:

  1. RUN 執(zhí)行命令并創(chuàng)建新的鏡像層,RUN 經(jīng)常用于安裝軟件包。

  2. CMD 設(shè)置容器啟動后默認(rèn)執(zhí)行的命令及其參數(shù),但 CMD 能夠被 docker run 后面跟的命令行參數(shù)替換。

  3. ENTRYPOINT 配置容器啟動時運行的命令。

下面我們詳細(xì)分析。

Shell 和 Exec 格式

我們可用兩種方式指定 RUN、CMD 和 ENTRYPOINT 要運行的命令:Shell 格式和 Exec 格式,二者在使用上有細(xì)微的區(qū)別。

Shell 格式

<instruction> <command>


例如:

RUN apt-get install python3  

CMD echo "Hello world"  

ENTRYPOINT echo "Hello world" 


當(dāng)指令執(zhí)行時,shell 格式底層會調(diào)用 /bin/sh -c <command> 。

例如下面的 Dockerfile 片段:

ENV name Cloud Man  

ENTRYPOINT echo "Hello, $name" 


執(zhí)行 docker run <image> 將輸出:

Hello, Cloud Man

注意環(huán)境變量 name 已經(jīng)被值 Cloud Man 替換。

下面來看 Exec 格式。

Exec 格式

<instruction> ["executable", "param1", "param2", ...]

例如:

RUN ["apt-get", "install", "python3"]  

CMD ["/bin/echo", "Hello world"]  

ENTRYPOINT ["/bin/echo", "Hello world"]

當(dāng)指令執(zhí)行時,會直接調(diào)用 <command>,不會被 shell 解析。
例如下面的 Dockerfile 片段:

ENV name Cloud Man  

ENTRYPOINT ["/bin/echo", "Hello, $name"]

運行容器將輸出:

Hello, $name

注意環(huán)境變量“name”沒有被替換。
如果希望使用環(huán)境變量,照如下修改

ENV name Cloud Man  

ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"]

運行容器將輸出:

Hello, Cloud Man

CMD 和 ENTRYPOINT 推薦使用 Exec 格式,因為指令可讀性更強,更容易理解。RUN 則兩種格式都可以。

RUN

RUN 指令通常用于安裝應(yīng)用和軟件包。

RUN 在當(dāng)前鏡像的頂部執(zhí)行命令,并通過創(chuàng)建新的鏡像層。Dockerfile 中常常包含多個 RUN 指令。

RUN 有兩種格式:

  1. Shell 格式:RUN

  2. Exec 格式:RUN ["executable", "param1", "param2"]

下面是使用 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 指令允許用戶指定容器的默認(rèn)執(zhí)行的命令。

此命令會在容器啟動且 docker run 沒有指定其他命令時運行。

  1. 如果 docker run 指定了其他命令,CMD 指定的默認(rèn)命令將被忽略。

  2. 如果 Dockerfile 中有多個 CMD 指令,只有最后一個 CMD 有效。

CMD 有三種格式:

  1. Exec 格式:CMD ["executable","param1","param2"]
    這是 CMD 的推薦格式。

  2. CMD ["param1","param2"] 為 ENTRYPOINT 提供額外的參數(shù),此時 ENTRYPOINT 必須使用 Exec 格式。

  3. Shell 格式:CMD command param1 param2

Exec 和 Shell 格式前面已經(jīng)介紹過了。
第二種格式 CMD ["param1","param2"] 要與 Exec 格式 的 ENTRYPOINT 指令配合使用,其用途是為 ENTRYPOINT 設(shè)置默認(rèn)的參數(shù)。我們將在后面討論 ENTRYPOINT 時舉例說明。

下面看看 CMD 是如何工作的。Dockerfile 片段如下:

CMD echo "Hello world"

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

Hello world

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

root@10a32dc7d3d3:/#

ENTRYPOINT

ENTRYPOINT 指令可讓容器以應(yīng)用程序或者服務(wù)的形式運行。

ENTRYPOINT 看上去與 CMD 很像,它們都可以指定要執(zhí)行的命令及其參數(shù)。不同的地方在于 ENTRYPOINT 不會被忽略,一定會被執(zhí)行,即使運行 docker run 時指定了其他命令。

ENTRYPOINT 有兩種格式:

  1. Exec 格式:ENTRYPOINT ["executable", "param1", "param2"] 這是 ENTRYPOINT 的推薦格式。

  2. Shell 格式:ENTRYPOINT command param1 param2

在為 ENTRYPOINT 選擇格式時必須小心,因為這兩種格式的效果差別很大。

Exec 格式

ENTRYPOINT 的 Exec 格式用于設(shè)置要執(zhí)行的命令及其參數(shù),同時可通過 CMD 提供額外的參數(shù)。

ENTRYPOINT 中的參數(shù)始終會被使用,而 CMD 的額外參數(shù)可以在容器啟動時動態(tài)替換掉。

比如下面的 Dockerfile 片段:

ENTRYPOINT ["/bin/echo", "Hello"]  

CMD ["world"]

當(dāng)容器通過 docker run -it [image] 啟動時,輸出為:

Hello world

而如果通過 docker run -it [image] CloudMan 啟動,則輸出為:

Hello CloudMan

Shell 格式

ENTRYPOINT 的 Shell 格式會忽略任何 CMD 或 docker run 提供的參數(shù)。

最佳實踐

  1. 使用 RUN 指令安裝應(yīng)用和軟件包,構(gòu)建鏡像。

  2. 如果 Docker 鏡像的用途是運行應(yīng)用程序或服務(wù),比如運行一個 MySQL,應(yīng)該優(yōu)先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可為 ENTRYPOINT 提供額外的默認(rèn)參數(shù),同時可利用 docker run 命令行替換默認(rèn)參數(shù)。

  3. 如果想為容器設(shè)置默認(rèn)的啟動命令,可使用 CMD 指令。用戶可在 docker run 命令行中替換此默認(rèn)命令。

到這里,我們已經(jīng)具備編寫 Dockerfile 的能力了。如果大家還覺得沒把握,推薦一個快速掌握 Dockerfile 的方法:去 Docker Hub 上參考那些官方鏡像的 Dockerfile。

以上就是如何理解Dockerfile 指令中的RUN和CMD及ENTRYPOINT,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前名稱:如何理解Dockerfile指令中的RUN和CMD及ENTRYPOINT
網(wǎng)站鏈接:http://muchs.cn/article14/pdggge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、營銷型網(wǎng)站建設(shè)網(wǎng)站制作、電子商務(wù)、ChatGPT、App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站