浅谈Dockerfile中ENTRYPOINT和CMD的区别

本文深入探讨了Docker容器中的ENTRYPOINT和CMD指令,解释了它们的区别以及exec和shell两种模式的工作原理。CMD用于提供默认命令,其设置可被命令行参数覆盖。ENTRYPOINT则允许命令行参数作为附加选项传递,exec模式下参数会添加到命令中,而shell模式下命令行参数可能被忽略。了解这些概念对于有效管理和定制Docker容器的启动行为至关重要。
摘要由CSDN通过智能技术生成
  1. 我们在看他们的区别的之前首先需要明白一点:

ENTRYPOINT和CMD都是用来指定容器启动时运行的命令。

  1. 再来看看什么是exec模式和shell模式:
  • exec模式
FROM centos:7.2
CMD ["top","-b"]
  • shell模式
FROM centos:7.2
CMD top -b

上面的例子也一目了然了,说得直白点,exec模式它的命令形式是双引号+数组的形式;而shell模式则是直接写出我们需要在容器中运行的命令CMD和ENTRYPOINT都支持这两种模式。(上面代码我只拿CMD举例,ENTRYPOINT也是同样的用法。)

  1. 下面有几种常用情况需要记住。
    (1)CMD指令的目的是为容器提供默认的执行命令,命令行参数可以覆盖CMD指令的设置,这只是重写,不能给CMD通过命令行传递参数。,下面以exec模式为例进行测试。
FROM centos:7.2.1511
CMD ["top","-b"]

运行容器可以看到运行的是top -b命令。

[root@VM_16_5_centos testCmd]# docker run myhello
top - 07:22:40 up 642 days, 20:29,  0 users,  load average: 0.02, 0.02, 0.05
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.3 ni, 98.9 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8010528 total,   218728 free,  2960640 used,  4831160 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4653588 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   40196   1600   1236 R   0.0  0.0   0:00.02 top

然后我们现在在后面加参数ls

[root@VM_16_5_centos testCmd]# docker run myhello ls
anaconda-post.log
bin
dev
etc
home
lib
lib64
lost+found
media

可以看到ls命令覆盖了top -b命令,同样,用shell模式测试也是相同的效果。
(2)ENTRYPOINT指令为exec模式时命令行上的参数会作为参数添加到ENTRYPOINT 指定命令的参数列表中。

FROM centos:7.2.1511
ENTRYPOINT ["top","-b"]

运行容器可以看到运行的是top -b命令。

[root@VM_16_5_centos testCmd]# docker run myhello
top - 07:39:23 up 642 days, 20:46,  0 users,  load average: 0.00, 0.01, 0.05
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.3 ni, 98.9 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8010528 total,   223152 free,  2980284 used,  4807092 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4633792 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   40196   1600   1236 R   0.0  0.0   0:00.02 top

然后我们现在在后面加参数-c。

[root@VM_16_5_centos testCmd]# docker run myhello -c
top - 07:41:24 up 642 days, 20:48,  0 users,  load average: 0.03, 0.03, 0.05
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.3 ni, 98.9 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8010528 total,   224444 free,  2981556 used,  4804528 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4632728 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   40196   1600   1236 R   0.0  0.0   0:00.02 top -b -c

可以看到现在容器运行的命令是top -b -c(右下角)。
我们现在将exec模式换成shell模式。

FROM centos:7.2.1511
ENTRYPOINT top -b

我们现在在后面加参数-c 看看是否还和exec模式一样。

[root@VM_16_5_centos testCmd]# docker run myhello -c
top - 07:55:37 up 642 days, 21:02,  0 users,  load average: 0.24, 0.11, 0.06
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.3 ni, 98.9 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8010528 total,   234216 free,  2976824 used,  4799488 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4637280 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   40196   1604   1236 R   0.0  0.0   0:00.02 top

可以看到还是top -b命令,说明shell模式下命令行加的-c参数会被忽略。当然,如果你想覆盖Dockerfile中的entrypoint命令,也是可以的。不同于CMD直接在命令行写参数就可以覆盖,entrypoint需要在命令行显示指定–entrypoint 参数。

[root@VM_16_5_centos testCmd]# docker run --entrypoint hostname  myhello
e06d1141dce1

上面我用hostname覆盖了top -b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qzxl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值