dockerfile 中的CMD 和 ENTRYPOINT 的区别

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

 学无止境,精益求精

前面两篇博客描述了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

 

 

 4、运行镜像

docker run d0e4226cd576

 

 

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

执行结果:

 

 

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

@天才卧龙的波尔克

 

posted @ 2022-04-11 14:17  天才卧龙  阅读(158)  评论(0编辑  收藏  举报