docker指令CMD和ENTRYPOINT的运用测试

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作为参数,并且可以被命令行的参数替换

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页