CMD

CMD指令有三种使用形式:

  • CMD ["executable", "param1", "param2"](优先选择使用的形式)

  • CMD ["param1", "param2"](作为entrypoint的默认参数)

  • CMD command param1 param2(shell 形式)

Dockerfile中只能有一条CMD指令。如果列出多个CMD,则只有最后一个CMD才会生效。

CMD的主要目的是为执行中的容器提供默认值。这些默认值可以包含可执行命令,也可以省略可执行命令,在这种情况下,必须指定ENTRYPOINT指令

如果使用CMDENTRYPOINT指令提供默认参数,则CMDENTRYPOINT指令均应使用JSON数组格式指定。

NOTE:

exec形式的指令被解析为JSON数组,这意味着对于单词,我们必须使用双引号包围,而不是单引号.

shell形式不同,exec形式不会调用命令行shell。这意味着正常的shell处理不会发生。例如CMD ["echo","$HOME"]不会在$HOME上进行变量替换。如果要进行shell处理,则可以使用shell形式或直接执行shell,例如:CMD ["sh","-c","echo $HOME"]。当使用exec形式并直接执行shell时(例如在shell形式中),是由shell进行环境变量扩展,而不是docker

当以shellexec形式调用时,CMD指令设置运行镜像时要执行的命令。

如果使用CMDshell形式,则将在/bin/sh -c中执行:

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

如果要在没有shell的情况下运行,则必须将命令表示为JSON数组,并提供可执行文件的完整路径。此数组形式是CMD的首选格式。任何其他参数必须在数组中分别表示为字符串:

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

如果希望容器每次都运行相同的可执行文件,则应考虑将ENTRYPOINTCMD结合使用。请参阅ENTRYPOINT

NOTE:

如果用户为docker run指定了参数,则它们将覆盖CMD中指定的默认值。

NOTE:

不要将RUNCMD混淆。RUN实际上是运行命令并提交结果,它是在构建阶段执行的。CMD在构建镜像时不执行任何操作,但是指定了镜像在启动时需要执行的命令。

Last updated