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
在构建时不执行任何操作,但指定了图像的预期命令。