CMD
CMD指令有三种使用形式:
-
CMD ["executable", "param1", "param2"](优先选择使用的形式)
-
CMD ["param1", "param2"](作为entrypoint的默认参数)
-
CMD command param1 param2(shell 形式)
Dockerfile 中只能有一条 CMD指令 。如果列出多个 CMD ,则只有最后一个 CMD 才会生效。
CMD 的主要目的是为执行中的容器提供默认值。这些默认值可以包含可执行命令,也可以省略可执行命令,在这种情况下,必须指定 ENTRYPOINT指令 。
如果使用 CMD 为 ENTRYPOINT指令 提供默认参数,则 CMD 和 ENTRYPOINT指令 均应使用 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 。
当以 shell 或 exec 形式调用时, CMD指令 设置运行镜像时要执行的命令。
如果使用 CMD 的 shell 形式,则将在 /bin/sh -c 中执行:
如果要在没有 shell 的情况下运行,则必须将命令表示为 JSON数组 ,并提供可执行文件的完整路径。此数组形式是 CMD 的首选格式。任何其他参数必须在数组中分别表示为字符串:
如果希望容器每次都运行相同的可执行文件,则应考虑将 ENTRYPOINT 与 CMD 结合使用。请参阅 ENTRYPOINT 。
NOTE:
如果用户为 docker run 指定了参数,则它们将覆盖 CMD 中指定的默认值。
NOTE:
不要将 RUN 与 CMD 混淆。 RUN 实际上是运行命令并提交结果,它是在构建阶段执行的。 CMD 在构建镜像时不执行任何操作,但是指定了镜像在启动时需要执行的命令。
Last updated
Was this helpful?