中cmd_Dockerfile中CMD和ENTRYPOINT的区别

Dockerfile中的CMD和ENTRYPOINT都是定义容器启动时执行的命令,但它们有区别。CMD指定的命令可被docker run命令的参数覆盖,而ENTRYPOINT保持不变,仅接收CMD或docker run参数作为参数。将两者结合使用,可以在ENTRYPOINT中执行初始化工作,CMD用于启动容器的主进程,允许在运行时灵活指定参数。
摘要由CSDN通过智能技术生成

Dockerfile中CMD和ENTRYPOINT的区别

在Dockerfile CMD是容器启动时运行的命令,ENTERPOINT作用和CMD是类似的,那么两者有何区别呢?先上结论:

CMD在运行docker run命令时容易被覆盖,而ENTERPOINT不容易被覆盖

下面通过示例演示下来看两者的区别?


Dockerfile

FROM alpine
CMD [ "/bin/echo","hello,world" ]

编译之后运行,结果如下:

# docker build -t test-cmd .
# docker run test-cmd
hello,world

换下运行命令再来看:

# docker run test-cmd /bin/echo hello,code
hello,code

可以看到后面的 /bin/echo hello,code 替换掉了 CMD 中指定的命令。


再来看ENTRYPOINT

Dockerfile

FROM alpine
ENTRYPOINT [ "/bin/echo","hello,world"]

编译之后运行,结果如下:

# docker build -t test-cmd .
# docker run test-cmd
hello,world

这里可以看到 CMD 和 ENTRYPOINT作用其实是一致的。


再将 CMD 和 ENTERYPOINT 组合在一起来看

Dockerfile

FROM alpine
ENTRYPOINT [ "/bin/echo"]
CMD [ "hello,world" ]

编译之后运行:

# docker build -t test-cmd .
# docker run test-cmd
hello,world

这里相当于运行了 /bin/echo hello,world这个命令。

再次替换docker run的参数来看两者的区别:

# docker run test-cmd hello,code
hello,code

我们在docker run后面添加了参数 hello,code,相当于运行了 /bin/echo hello,code,也就是用 hello,code 覆盖了CMD中的hello,world参数。


其实ENTRYPOINT也可以在docker run中添加参数来指定,只不过麻烦点 要加 --entrypoint

还是上面的 Dockerfile编译运行。在docker run命令中用 /bin/ls 替换掉了 ENTRYPOINT 中的 /bin/echo,用/bin/替换掉了 CMD 中的 hello,world

# docker build -t test-cmd .
# docker run --entrypoint="/bin/ls" test-cmd /bin/
arch
ash
base64
bbconfig
busybox
cat
chgrp
chmod
chown
conspy
cp
date
dd
df
...

总结

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。 ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。
当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"

这样做有什么好处呢?

  1. 通过将 ENTRYPOINT 和 CMD 组合起来就可以灵活地在docker run的时候指定需要的参数。
  2. 容器启动时可能需要做一些初始化的工作,那么可以在 ENTRYPOINT 来做这些事情(比如运行一个脚本来做初始化),用CMD来启动容器

  • [1] <<第一本Docker书>>
  • [2] <<Docker从入门到实践>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值