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 属于命令追加
@天才卧龙的波尔克