使用 exec 模式時,容器中的任務進程就是容器內的 1 號進程docker
使用 shell 模式時,docker 會以 /bin/sh -c "task command"
的方式執行任務命令。也就是說容器中的 1 號進程不是任務進程而是 bash 進程shell
CMD 指令的目的是:爲容器提供默認的執行命令。bash
CMD 指令有三種使用方式,其中的一種是爲 ENTRYPOINT 提供默認的參數:app
?.net
CMD [param1","param2"]
另外兩種使用方式分別是 exec 模式和 shell 模式:命令行
?設計
CMD ["executable","param1","param2"] // 這是 exec 模式的寫法,注意須要使用雙引號。CMD command param1 param2 // 這是 shell 模式的寫法。`
注意命令行參數能夠覆蓋 CMD 指令的設置,可是隻能是重寫,卻不能給 CMD 中的命令經過命令行傳遞參數。
通常的鏡像都會提供容器啓動時的默認命令,可是有些場景中用戶並不想執行默認的命令。用戶能夠經過命令行參數的方式覆蓋 CMD 指令提供的默認命令。code
ENTRYPOINT 指令的目的也是爲容器指定默認執行的任務。htm
ENTRYPOINT 指令有兩種使用方式,就是咱們前面介紹的 exec 模式和 shell 模式進程
ENTRYPOINT ["executable", "param1", "param2"] // 這是 exec 模式的寫法,注意須要使用雙引號。ENTRYPOINT command param1 param2 // 這是 shell 模式的寫法。
exec 模式和 shell 模式的基本用法和 CMD 指令是同樣的,下面咱們介紹一些比較特殊的用法。
同時使用 CMD 和 ENTRYPOINT 的狀況
對於 CMD 和 ENTRYPOINT 的設計而言,多數狀況下它們應該是單獨使用的。固然,有一個例外是 CMD 爲 ENTRYPOINT 提供默認的可選參數。
咱們大概能夠總結出下面幾條規律:
• 若是 ENTRYPOINT 使用了 shell 模式,CMD 指令會被忽略。
• 若是 ENTRYPOINT 使用了 exec 模式,CMD 指定的內容被追加爲 ENTRYPOINT 指定命令的參數。
• 若是 ENTRYPOINT 使用了 exec 模式,CMD 也應該使用 exec 模式。
下表給出了Docker 與 Kubernetes中對應的字段名稱。
Description | Docker field name | Kubernetes field name |
---|---|---|
The command run by the container | Entrypoint | command |
The arguments passed to the command | Cmd | args |
若是要覆蓋默認的Entrypoint 與 Cmd,須要遵循以下規則:
command
或者 args
,那麼將使用Docker鏡像自帶的命 令及其入參。command
可是沒有設置args
,那麼容器啓動時只會執行該 命令,Docker鏡像中自帶的命令及其入參會被忽略。args
,那麼Docker鏡像中自帶的命令會使用該新入參做爲 其執行時的入參。command
與 args
,那麼Docker鏡像中自帶的命令及 其入參會被忽略。容器啓動時只會執行配置中設置的命令,並使用配置中設置的入參做爲 命令的入參。下表涵蓋了各種設置場景:
Image Entrypoint | Image Cmd | Container command | Container args | Command run |
---|---|---|---|---|
[/ep-1] |
[foo bar] |
|
|
[ep-1 foo bar] |
[/ep-1] |
[foo bar] |
[/ep-2] |
|
[ep-2] |
[/ep-1] |
[foo bar] |
|
[zoo boo] |
[ep-1 zoo boo] |
[/ep-1] |
[foo bar] |
[/ep-2] |
[zoo boo] |
[ep-2 zoo boo] |
官方文檔 傳送門