CMD 指令

CMD 指令有三種形式:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

Dockerfile 中只能有一條 CMD 指令。如果列出多個 CMD,那麼只有最後一個 CMD 才會生效。

CMD 的主要目的是為執行容器提供預設值。這些預設值可以包含可執行檔案,也可以省略可執行檔案,在這種情況下,你還必須指定 ENTRYPOINT 指令。

注意:如果 CMD 用於為 ENTRYPOINT 指令提供預設引數,則應使用 JSON 陣列格式指定 CMDENTRYPOINT 指令。

注意:exec 表單被解析為 JSON 陣列,這意味著你必須使用雙引號(“)來圍繞單詞而不是單引號(’)。

注意:與 shell 表單不同,exec 表單不會呼叫命令 shell。這意味著不會發生正常的 shell 處理。例如,CMD [ "echo", "$HOME" ] 不會對 $HOME 進行變數替換。如果你需要 shell 處理,則可以使用 shell 表單或直接執行 shell,例如:CMD [ "sh", "-c", "echo $HOME" ]

在 shell 或 exec 格式中使用時,CMD 指令設定執行映像時要執行的命令。

如果你使用 CMD 的 shell 形式,那麼命令將在/bin/sh -c 中執行:

FROM ubuntu
CMD echo "This is a test." | wc -

如果要在沒有 shell 的情況下執行命令,則必須將該命令表示為 JSON 陣列並提供可執行檔案的完整路徑。這種陣列形式是 CMD 的首選格式。任何其他引數必須在陣列中單獨表示為字串:

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

如果你希望容器每次都執行相同的可執行檔案,那麼你應該考慮將 ENTRYPOINTCMD 結合使用。見 ENTRYPOINT

如果使用者指定了 docker run 的引數,那麼它們將覆蓋 CMD 中指定的預設值。

注意:不要將 RUNCMD 混淆。RUN 實際上在影象構建時執行命令並提交結果; CMD 在構建時不執行任何操作,但指定了影象的預期命令。