Dockerfile之CMD和ENTRYPOINT区别

1 CMD命令

cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。

1.1 执行条件

(1)docker run没有指定任何的执行命令或者(2)dockerfile里面也没有entrypoint
才会使用CMD内命令执行

1.2 用法

The CMD instruction has three forms:
 
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

1.2.1 用法1:带有中括号的形式。(推荐)

该用法是命令没有在任何shell终端环境下,需要自行添加解释器。如果我们要执行shell,必须把shell加入到中括号的参数中。

FROM centos
 
CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]

注意点:第一个参数必须是命令的全路径才行。而且,一个dockerfile至多只能有一个cmd,如果有多个,只有最后一个生效。

2 ENTRYPOINT命令

entrypoint才是正统地用于定义容器启动以后的执行体的,其实我们从名字也可以理解,这个是容器的“入口”。

2.1 执行条件

2.2 用法

ENTRYPOINT has two forms:
 
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

2.2.1 用法1:带有中括号的形式。(推荐)

和cmd的中括号形式是一致的,但是这里貌似是在shell的环境下执行的,与cmd有区别。
如果run命令后面有东西,那么后面的全部都会作为entrypoint的参数。
如果run后面没有额外的东西,但是cmd有,那么cmd的全部内容会作为entrypoint的参数。
当然如果要在run里面覆盖,也是有办法的,使用–entrypoint即可。

FROM centos
 
CMD ["p in cmd"]
ENTRYPOINT ["echo"]

docker run cfcc
执行结果:p in cmd
docker run cfcc p in run
执行结果: p in run

3 总结

一般还是会用entrypoint的中括号形式作为docker容器启动以后的默认执行命令。
里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。
如果我们想用默认参数,就直接run,否则想用其他参数,就run里面加参数。

参考:https://blog.youkuaiyun.com/u010900754/article/details/78526443

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值