CMD和ENTRYPOINT都同样支持 exec 模式和 shell 模式
Dockerfile和镜像
这是两个指令在两个模式下的Dockerfile
[root@k8s2 cmds]# ls
cmdexec cmdshell entrypointexec entrypointshell
分别用这几个Dockerfile构建镜像
[root@k8s2 cmds]# docker build -f cmdshell -t cetnoscmdshell .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 0f3e07c0138f
Step 2/2 : CMD echo "CMD SHELLMODE DEFAULT"
---> Running in 3208f1d4c319
Removing intermediate container 3208f1d4c319
---> d856349d04c7
Successfully built d856349d04c7
Successfully tagged cetnoscmdshell:latest
略......
构建后的DOCKER镜像
一、CMD的EXEC模式
[root@k8s2 cmds]# cat cmdexec
FROM centos
CMD ["/bin/echo","hello","cmd"," exec"]
镜像测试
[root@k8s2 cmds]# docker run --rm centoscmdexec
hello cmd exec
[root@k8s2 cmds]# docker run --rm centoscmdexec hostname
1c3ea70a0356
CMD在exec模式下,命令行没有参数将使用Dockerfile的默认参数,命令行传递的参数将覆盖exec模式的默认参数,另外不传递环境变量
二、CMD的SHELL模式
[root@k8s2 cmds]# cat cmdshell
FROM centos
CMD echo "CMD SHELLMODE DEFAULT"
镜像测试
[root@k8s2 cmds]# docker run --rm cetnoscmdshell
CMD SHELLMODE DEFAULT
[root@k8s2 cmds]# docker run --rm cetnoscmdshell hostname
0407e57ee0e8
CMD在shell模式下,命令行没有参数将使用Dockerfile的默认参数,命令行传递的参数将覆盖shell模式的默认参数,传递环境变量
三、ENTRYPOINT的EXEC模式
[root@k8s2 cmds]# cat entrypointexec
FROM centos
ENTRYPOINT ["ls","/","-l"]
镜像测试
[root@k8s2 ~]# docker run --rm centosenexec
total 8
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Dec 20 13:36 dev
drwxr-xr-x 51 root root 4096 Dec 20 13:35 etc
drwxr-xr-x 2 root root 6 May 11 2019 home
......略
[root@k8s2 ~]# docker run --rm centosenexec -t -r
total 8
drwxr-xr-x 2 root root 6 May 11 2019 srv
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 6 May 11 2019 opt
drwxr-xr-x 2 root root 6 May 11 2019 mnt
drwxr-xr-x 2 root root 6 May 11 2019 media
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
drwxr-xr-x 2 root root 6 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwx------ 2 root root 6 Sep 27 17:13 lost+found
drwxr-xr-x 12 root root 133 Sep 27 17:13 usr
drwxr-xr-x 20 root root 4096 Sep 27 17:13 var
drwxrwxrwt 7 root root 138 Sep 27 17:13 tmp
drwxr-xr-x 11 root root 152 Sep 27 17:13 run
dr-xr-x--- 2 root root 154 Sep 27 17:13 root
dr-xr-xr-x 13 root root 0 Dec 20 08:57 sys
drwxr-xr-x 51 root root 4096 Dec 20 13:38 etc
dr-xr-xr-x 188 root root 0 Dec 20 13:38 proc
drwxr-xr-x 5 root root 340 Dec 20 13:38 dev
ENTRYPOINT在exec模式下,命令行将使用Dockerfile的默认参数,命令行传递的参数默认将会被追加到Dockerfile指定参数的后面
四、ENTRYPOINT的SHELL模式
[root@k8s2 cmds]# cat entrypointshell
FROM centos
ENTRYPOINT ls /
镜像测试
[root@k8s2 ~]# docker run --rm centosenshell
bin
dev
etc
home
......略
[root@k8s2 ~]# docker run --rm centosenshell -t -r
bin
dev
etc
home
......略
[root@k8s2 ~]# docker run --rm centosenshell hostname
bin
dev
etc
home
......略
[root@k8s2 ~]# docker run --rm --entrypoint hostname centosenshell
1c4a9d298f18
ENTRYPOINT在shell模式下,命令行将使用Dockerfile的默认参数,命令行传递的参数默认不起效,不会追加,也不会覆盖
只有在命令行显式指定了--entrypoint选项才会覆盖Dockerfile的设置
五、另外,还有ENTRYPOINT在exec模式下,可以使用CMD作为参数
[root@k8s2 cmds]# cat entrypointexeccmd
FROM centos
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
镜像测试
[root@k8s2 cmds]# docker build -f entrypointexeccmd -t centosenexeccmd .
Sending build context to Docker daemon 6.144kB
Step 1/3 : FROM centos
---> 0f3e07c0138f
Step 2/3 : ENTRYPOINT ["/bin/echo","hello"]
---> Running in fa2251f0a349
Removing intermediate container fa2251f0a349
---> 21b137c412ee
Step 3/3 : CMD ["world"]
---> Running in 9299cc7cc94f
Removing intermediate container 9299cc7cc94f
---> cc4d836a939d
Successfully built cc4d836a939d
Successfully tagged centosenexeccmd:latest
[root@k8s2 cmds]# docker run --rm centosenexeccmd
hello world
[root@k8s2 cmds]# docker run --rm centosenexeccmd yellow
hello yellow
ENTRYPOINT在exec模式下使用CMD作为参数,并且可以被命令行的参数替换