十年河东,十年河西,莫欺少年穷

 学无止境,精益求精

dockerfile  中的CMD 和 ENTRYPOINT 的区别_docker

前面两篇博客描述了dockerfile基础及自定义dockerfile,今日来个小练习

前面两篇博客为:dockerfile【命令脚本】 构建镜像基础知识​  、  docker 镜像的生成方式,初识dockerfile,dockerfile 指定匿名挂载

CMD 采取的是替换策略,ENTRYPOINT 采取的追加策略

练习 1

使用CMD命令编写一个简易的dockerfile

FROM centos
MAINTAINER wolong.Chen<chenwolong2022@163.com>
CMD ["ls","-a"]

2、构建镜像

docker build -f dockerfile01 -t cmdtest .

2.1、构建过程如下:

Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM centos
---> 5d0da3dc9764
Step 2/3 : MAINTAINER wolong.Chen<chenwolong2022@163.com>
---> Running in 980f186a8d7f
Removing intermediate container 980f186a8d7f
---> 4692e342d894
Step 3/3 : CMD ["ls","-a"]
---> Running in e56481f6d5f7
Removing intermediate container e56481f6d5f7
---> d0e4226cd576
Successfully built d0e4226cd576
Successfully tagged cmdtest:latest

3、查看构建的镜像

docker images

dockerfile  中的CMD 和 ENTRYPOINT 的区别_centos_02



 4、运行镜像

docker run d0e4226cd576

dockerfile  中的CMD 和 ENTRYPOINT 的区别_替换策略_03



5、说明

此镜像直接以centos为基础镜像,并通过CMD执行 ls -a 命令

6、执行如下命令是否能运行cmdtest镜像

docker run d0e4226cd576 -l

因为镜像中会执行 ls -a 命令,我们运行时加上 -l 是希望直接运行 ls -al 命令,此时容器是否能成功执行呢?

答案是执行报错,报错信息如下:

docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0001] error waiting for container: context canceled

大致意思是 -l 不是一条有效的命令

因此,也证明了CMD采取的并非追加策略,而是替换策略

练习 2

使用ENTRYPOINT命令编写一个简易的dockerfile

此时只需将我们的dockerfile 中的cmd 替换为 ENTRYPOINT 即可

编写dockerfile 如下:

FROM centos
MAINTAINER wolong.Chen<chenwolong2022@163.com>
ENTRYPOINT ["ls","-a"]

构建镜像

docker build -f dockerfile01 -t  enttest .

执行镜像 ,并在后面追加命令参数 -l

docker run 8a2063322a2e -l

执行结果:

dockerfile  中的CMD 和 ENTRYPOINT 的区别_centos_04



 由此可见 CMD 属于命令替换,而 ENTRYPOINT 属于命令追加