- 我们在看他们的区别的之前首先需要明白一点:
ENTRYPOINT和CMD都是用来指定容器启动时运行的命令。
- 再来看看什么是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)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。