Dockerfile详细解析(七)——CMD

CMD

CMD 指令有三种形式:

  • CMD ["executable","param1","param2"](exec 形式,这个是推荐的形式)
  • CMD ["param1","param2"](在ENTRYPOINT作为默认参数)
  • CMD command param1 param2 (shell 形式)

Dockerfile中只能有一个 CMD 指令。如果你列出超过一个CMD,那么只有最后一个 CMD 会生效。

CMD的主要目的是为了提供运行容器的默认方法。这些默认方法可以包含一个可执行脚本,或者它们可以省略这个可执行脚本,在这种情况你还必须指定一个ENTRYPOINT 指令。

注意:如果 CMD 被用来提供作为ENTRYPOINT指令的默认参数,CMDENTRYPOINT 两个指令都要使用 JSON 数组格式来指定。

注意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 指令会设置命令在镜像运行时执行。

如果你使用了CMDshell形式,那么<command>将会在/bin/sh -c运行。

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

如果你想运行你的<command>而不用shell那么你一定要把命令用JSON数组开表示和在执行脚本中使用全路径。CMD推荐使用数组形式的格式。任何附加参数必须单独表示为数组中的字符串:

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

如果你想你的容器每次运行一样的可执行脚本,那么你应该考虑组合使用ENTRYPOINTCMD。参考ENTRYPOINT.

如果用户指定参数到docker run,那么将会覆盖CMD默认指定的参数。

注意:不要混淆RUNCMDRUN 实际上运行一个命令和提交结果;CMD在构建的过程作不是执行任何东西,但指定了镜像预设的命令(启动容器时运行的命令)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值