CMD和ENTRYPOINT

本文详细介绍了Docker中CMD与ENTRYPOINT指令的使用方式,包括它们的不同形式、如何设置默认值、如何与用户参数交互,以及在构建镜像时的作用区别。文章还解释了如何正确地使用JSON数组格式来指定参数,以及如何处理shell命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMD

CMD指令有三种形式:

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

Dockerfile中只能有一条CMD指令。如果存在多个CMD,那么只有最后一个CMD才会生效。

CMD的主要目的是为正在执行的容器提供默认值。这些默认值可以包括可执行文件,也可以省略可执行文件。省略可执行文件时必须指定ENTRYPOINT指令。

备注:如果CMD用于为ENTRYPOINT指令提供默认参数,则CMD和ENTRYPOINT指令都应该使用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设置了运行镜像时要执行的命令。

如果使用CMD的shell形式,那么<命令>将在/bin/sh -c中执行:

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

如果不想在shell的形式下运行<command>,那么必须将该命令表示为JSON数组,并给出可执行文件的完整路径。建议优先使用CMD命令的数组形式。任何额外的参数必须单独表示为数组中的字符串:

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

如果希望容器每次运行相同的可执行文件,那么应该考虑将ENTRYPOINT与CMD结合使用。

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

备注:不要将RUN与CMD混淆。RUN实际运行一个命令并提交结果;CMD在构建时不执行任何操作,但为镜像指定预期的命令。

ENTRYPOINT

ENTRYPOINT有两种形式:

  • ENTRYPOINT ["executable", "param1", "param2"] (exec 形式,这是优先形式)
  • ENTRYPOINT command param1 param2 (shell 形式)

ENTRYPOINT允许您配置将作为可执行文件运行的容器。

 

转载于:https://my.oschina.net/jennerlo/blog/3016956

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值