中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dockerfile中的CMD和ENTRYPOINT命令怎么用

發布時間:2022-05-20 15:21:18 來源:億速云 閱讀:643 作者:iii 欄目:大數據

這篇文章主要介紹了Dockerfile中的CMD和ENTRYPOINT命令怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Dockerfile中的CMD和ENTRYPOINT命令怎么用文章都會有所收獲,下面我們一起來看看吧。

exec 模式

使用 exec 模式時,容器中的任務進程就是容器內的 1 號進程,看下面的例子:

from ubuntu
cmd [ "top" ]

把上面的代碼保存到 test1 目錄的 dockerfile 中,然后進入 test1 目錄構建鏡像并啟動一個容器:

$ docker build -t test1 .
$ docker run -idt --name testcon test1

然后查看容器中的進程 id:

$ docker exec testcon ps aux

Dockerfile中的CMD和ENTRYPOINT命令怎么用

從圖中我們看到運行 top 命令的進程 id 為 1。

exec 模式是建議的使用模式,因為當運行任務的進程作為容器中的 1 號進程時,我們可以通過 docker 的 stop 命令優雅的結束容器(詳情請參考《》)。

exec 模式的特點是不會通過 shell 執行相關的命令,所以像 $home 這樣的環境變量是取不到的:

from ubuntu
cmd [ "echo", "$home" ]

把上面的代碼保存到 test1 目錄的 dockerfile 中,然后進入 test1 目錄構建鏡像并啟動一個容器:

$ docker build --no-cache -t test1 .
$ docker run --rm test1

Dockerfile中的CMD和ENTRYPOINT命令怎么用

通過 exec 模式執行 shell 可以獲得環境變量:

from ubuntu
cmd [ "sh", "-c", "echo $home" ]

把上面的代碼保存到 test1 目錄的 dockerfile 中,然后進入 test1 目錄構建鏡像并啟動一個容器:

$ docker build --no-cache -t test1 .
$ docker run --rm test1

Dockerfile中的CMD和ENTRYPOINT命令怎么用

這次正確取到了 $home 環境變量的值。

shell 模式

使用 shell 模式時,docker 會以 /bin/sh -c "task command" 的方式執行任務命令。也就是說容器中的 1 號進程不是任務進程而是 bash 進程,看下面的例子:

from ubuntu
cmd top

把上面的代碼保存到 test2 目錄的 dockerfile 中,然后進入 test2 目錄構建鏡像并啟動一個容器:

$ docker build -t test2 .
$ docker run -itd --name testcon2 test2

然后查看容器中的進程 id:

$ docker exec testcon2 ps aux

Dockerfile中的CMD和ENTRYPOINT命令怎么用

1 號進程執行的命令居然是 /bin/sh -c top。而我們指定的 top 命令的進程 id 為 7。這是由 docker 內部決定的,目的是讓我們執行的命令或者腳本可以取到環境變量。

cmd 指令

cmd 指令的目的是:為容器提供默認的執行命令。

cmd 指令有三種使用方式,其中的一種是為 entrypoint 提供默認的參數:

cmd ["param1","param2"]

另外兩種使用方式分別是 exec 模式和 shell 模式:

cmd ["executable","param1","param2"] // 這是 exec 模式的寫法,注意需要使用雙引號。
cmd command param1 param2 // 這是 shell 模式的寫法。

注意命令行參數可以覆蓋 cmd 指令的設置,但是只能是重寫,卻不能給 cmd 中的命令通過命令行傳遞參數。
一般的鏡像都會提供容器啟動時的默認命令,但是有些場景中用戶并不想執行默認的命令。用戶可以通過命令行參數的方式覆蓋 cmd 指令提供的默認命令。比如通過下面命令創建的鏡像:

from ubuntu
cmd [ "top" ]

在啟動容器時我們通過命令行指定參數 ps aux 覆蓋默認的 top 命令:

Dockerfile中的CMD和ENTRYPOINT命令怎么用

從上圖可以看到,命令行上指定的 ps aux 命令覆蓋了 dockerfile 中的 cmd [ "top" ]。實際上,命令行上的命令同樣會覆蓋 shell 模式的 cmd 指令。

entrypoint 指令

entrypoint 指令的目的也是為容器指定默認執行的任務。

entrypoint 指令有兩種使用方式,就是我們前面介紹的 exec 模式和 shell 模式:

entrypoint ["executable", "param1", "param2"] // 這是 exec 模式的寫法,注意需要使用雙引號。
entrypoint command param1 param2 // 這是 shell 模式的寫法。

exec 模式和 shell 模式的基本用法和 cmd 指令是一樣的,下面我們介紹一些比較特殊的用法。

指定 entrypoint 指令為 exec 模式時,命令行上指定的參數會作為參數添加到 entrypoint 指定命令的參數列表中。用下面的代碼構建鏡像 test1:

from ubuntu
entrypoint [ "top", "-b" ]

運行下面的命令:

$ docker run --rm test1 -c

Dockerfile中的CMD和ENTRYPOINT命令怎么用

我們在命令行上添加的參數被追加到了 top 命令的參數列表中。

由 cmd 指令指定默認的可選參數:

from ubuntu
entrypoint [ "top", "-b" ]
cmd [ "-c" ]

使用這段代碼構建鏡像 test2 并不帶命令行參數啟動容器:

$ docker run --rm test2

這時容器中運行的命令為:top -b -c。

如果我們指定命令行參數:

$ docker run --rm test2 -n 1

-n 1 會覆蓋 通過 cmd [ "-c" ] 指定的參數,容器執行的命令為:top -b -n 1

Dockerfile中的CMD和ENTRYPOINT命令怎么用

注意上圖的輸出顯示 -c 參數被覆蓋了。

指定 entrypoint 指令為 shell 模式時,會完全忽略命令行參數:

from ubuntu
entrypoint echo $home

把上面的代碼編譯成鏡像 test2,分別不帶命令行參數和使用命令行參數 ls 執行命令:

Dockerfile中的CMD和ENTRYPOINT命令怎么用

我們看到 ls 命令沒有被執行,這說明命令行參數被 entrypoint 指令的 shell 模式忽略了。

覆蓋默認的 entrypoint 指令:

entrypoint 指令也是可以被命令行覆蓋的,只不過不是默認的命令行參數,而是需要顯式的指定 --entrypoint 參數。比如我們通過下面的方式覆蓋上面鏡像中的 echo $home 命令:

$ docker run --rm --entrypoint hostname test2

Dockerfile中的CMD和ENTRYPOINT命令怎么用

這里我們使用 hostname 命令覆蓋了默認的 echo $home 命令。

dockerfile 中至少要有一個

如果鏡像中既沒有指定 cmd 也沒有指定 entrypoint 那么在啟動容器時會報錯。這不算是什么問題,因為現在能見到的絕大多數鏡像都默認添加了 cmd 或 entrypoint 指令。

指定任意一個,效果差不多

從結果上看,cmd 和 entrypoint 是一樣的,我們可以通過它們實現相同的目的。下面我們分別用 cmd 和 entrypoint 設置 top -b 命令,然后觀察容器運行時的 metadata 信息:

Dockerfile中的CMD和ENTRYPOINT命令怎么用

或者:

Dockerfile中的CMD和ENTRYPOINT命令怎么用

雖然實現方式不同,但最終容器運行的命令是一樣的。

同時使用 cmd 和 entrypoint 的情況

對于 cmd 和 entrypoint 的設計而言,多數情況下它們應該是單獨使用的。當然,有一個例外是 cmd 為 entrypoint 提供默認的可選參數。

我們大概可以總結出下面幾條規律:

     ? 如果 entrypoint 使用了 shell 模式,cmd 指令會被忽略。

     ? 如果 entrypoint 使用了 exec 模式,cmd 指定的內容被追加為 entrypoint 指定命令的參數。

     ? 如果 entrypoint 使用了 exec 模式,cmd 也應該使用 exec 模式。

真實的情況要遠比這三條規律復雜,好在 docker 給出了官方的解釋,如下圖所示:

Dockerfile中的CMD和ENTRYPOINT命令怎么用

關于“Dockerfile中的CMD和ENTRYPOINT命令怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Dockerfile中的CMD和ENTRYPOINT命令怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁乡县| 海晏县| 南汇区| 临城县| 莒南县| 青阳县| 阿鲁科尔沁旗| 焦作市| 锡林郭勒盟| 黎平县| 雷州市| 嘉祥县| 南城县| 无极县| 双桥区| 乡城县| 洪泽县| 定兴县| 颍上县| 伊宁县| 鄂托克前旗| 饶平县| 巍山| 泰兴市| 广州市| 阿瓦提县| 长春市| 大连市| 勃利县| 上饶县| 安福县| 沂水县| 公主岭市| 黄浦区| 车致| 枣强县| 韩城市| 隆安县| 萍乡市| 巩义市| 汉阴县|