区别介绍
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指令的主要区别。