【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时成功运行了。

dockerfile entrypoing 与cmd区别 dockerfile cmd和entrypoint_centos


再试着加-l参数运行,我想要实现ls -l的效果。能否成功呢?接着往下看实验

docker run -it mycentos:1 -i

很明显,失败了。

dockerfile entrypoing 与cmd区别 dockerfile cmd和entrypoint_linux_02

原因

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时成功运行了。

dockerfile entrypoing 与cmd区别 dockerfile cmd和entrypoint_centos_03


再试着加-l参数运行,我想要实现ls -l的效果。这次能否成功呢?接着往下看实验

docker run -it mycentos:2 -l

ls -l查看当前文件夹下详细的文件信息,这里已经实现了我想要的。

dockerfile entrypoing 与cmd区别 dockerfile cmd和entrypoint_docker_04


当使用ENTRYPOINT指令时,docker run后加的参数-l作用到mycentos:2镜像上会以ls -l指令执行。

这也就是CMD指令和ENTRYPOINT指令的主要区别。