【Docker那些事】系列文章
Dockerfile 文件结构、docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战案例
区别介绍
CMD [“要运行的程序”,“参数1”,“参数2”] : 指定启动容器时要运行的命令或脚本。可以有多个CMD指令,但只有最后一个生效。CMD会被docker run 指令后的参数替换 ENTRYPOINT [“要运行的程序”,“参数1”,“参数2”] : 和CMD一样,指定启动容器时要运行的命令或脚本。ENTRYPOINT不会被docker run 指令后的参数替换,而是在其后追加参数
实例说明CMD和ENTRYPOINT的区别
CMD实例
Dockerfile文件
FROM centos
MAINTAINER ber & ber@email.com
CMD ["ls"]
构建镜像
这里因为Dockerfile文件已经存在,我另存了一个Dockerfile1文件,构建时需要-f 指定一下使用的Dockerfile文件
docker build -f Dockerfile1 -t mycentos:1 .
运行新镜像mycentos:1
docker run -it mycentos:1
可以看到最后的CMD指令在docker run时成功运行了。 再试着加-l 参数运行,我想要实现ls -l 的效果。能否成功呢?接着往下看实验
docker run -it mycentos:1 -i
很明显,失败了。
原因
CMD会被docker run 指令后的参数替换。 在输入加参数-l 指令后
docker run -it mycentos:1 -l
CMD ls 指令 就被替换成 CMD -l ,这个指令明显是错的,当然不能执行,于是就报错提示指令不存在。
ENTRYPOINT实例
Dockerfile文件
FROM centos
MAINTAINER ber & ber@email.com
ENTRYPOINT ["ls"]
构建镜像
这里也是因为Dockerfile文件已经存在,我另存了一个Dockerfile2文件,构建时需要-f 指定一下使用的Dockerfile文件
docker build -f Dockerfile2 -t mycentos:2 .
运行新镜像mycentos:2
docker run -it mycentos:2
可以看到最后的ENTRYPOINT指令在docker run时成功运行了。 再试着加-l 参数运行,我想要实现ls -l 的效果。这次能否成功呢?接着往下看实验
docker run -it mycentos:2 -l
ls -l 查看当前文件夹下详细的文件信息,这里已经实现了我想要的。 当使用ENTRYPOINT指令时,docker run 后加的参数-l 作用到mycentos:2镜像上会以ls -l 指令执行。 这也就是CMD指令和ENTRYPOINT指令的主要区别。
|