Dockerfile的CMD与ENTRYPOINT的区别

CMD和ENTRYPOINT

我们先来试一下构建以下这个Dockerfile,并运行

FROM centos

CMD ["ls","-a"]

构建

[root@zhima lizhi]# docker build -t mycentos .
Sending build context to Docker daemon  17.92kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
 ---> Running in a1e70a05d8dd
Removing intermediate container a1e70a05d8dd
 ---> 00433fd4c299
Successfully built 00433fd4c299
Successfully tagged mycentos:latest

运行

[root@zhima lizhi]# docker run -it --name "centos1" mycentos
.   .dockerenv	dev  home  lib64       media  opt   root  sbin	sys  usr
..  bin		etc  lib   lost+found  mnt    proc  run   srv	tmp  var

可以发现,进入容器之后,就执行了ls -a命令

我们尝试一下在启动的时候加入一些参数

[root@zhima lizhi]# docker run -it --name "centos2" mycentos -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

我们发现容器并没有执行ls -al,而是直接报错了

其实这就是CMD的特性,当我在启动容器的时候添加了一个CMD后

镜像中定义的CMD就被覆盖掉了

单独的-l当然会报错了


我们来看一下使用ENTRYPOINT会怎么样

修改Dockerfile

FROM centos

ENTRYPOINT ["ls","-a"]

重新构建

[root@zhima lizhi]# docker build -t mycentos .
Sending build context to Docker daemon  17.92kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 22ef40dea625
Removing intermediate container 22ef40dea625
 ---> 73a3d51b4d84
Successfully built 73a3d51b4d84
Successfully tagged mycentos:latest

运行容器

[root@zhima lizhi]# docker run -it --name "centos1" mycentos -l
total 56
drwxr-xr-x   1 root root 4096 Jul 14 08:52 .
drwxr-xr-x   1 root root 4096 Jul 14 08:52 ..
-rwxr-xr-x   1 root root    0 Jul 14 08:52 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Jul 14 08:52 dev
drwxr-xr-x   1 root root 4096 Jul 14 08:52 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 191 root root    0 Jul 14 08:52 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Jan 29 10:27 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var

可以发现,容器执行的是ls -al-l指令被追加给了ENTRYPOINT定义的语句

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻\n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值