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 陣列格式指定 CMD
和 ENTRYPOINT
指令。
注意: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"]
如果你希望容器每次都執行相同的可執行檔案,那麼你應該考慮將 ENTRYPOINT
與 CMD
結合使用。見 ENTRYPOINT
。
如果使用者指定了 docker run 的引數,那麼它們將覆蓋 CMD
中指定的預設值。
注意:不要將 RUN
與 CMD
混淆。RUN
實際上在影象構建時執行命令並提交結果; CMD
在構建時不執行任何操作,但指定了影象的預期命令。