1、在docker学习之Dockerfile 我们知道了Dockerfile的一些基本的保留字指令,对比一下比较容器混淆的指令,如下:
CMD 指定一个容器启动时要运行的命令。Dockerfile 中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
2、我们去tomcat官方Dockerfile中发现最后执行的指令为
CMD ["catalina.sh", "run"] ,如图:
所以当我们执行docker run -it -p 8080:8080 tomcat后tomcat就会运行起来,如图:
现在我们执行docker run -it -p 8080:8080 tomcat ls -l 看看是什么效果,如图:
发现tomcat根本没有运行起来,这就是CMD 指令的效果,最后的指令会被docker run后面的参数替换
3、下面我们看一下CMD和ENTRYPOINT的区别,重新创建一个DokcerFile,http://ip.cn 是一个查询ip的网站,能够解析出你当前的所在的区域,相关脚本如下:
FROM centos
RUN yum install -y curl
CMD ["curl", "-s","https://ip.cn/api/index?ip=&type=0"]
执行docker build -f /mydocker/Dockerfile3 -t myip .(注意后面有一个点)
构建完成后docker images查看镜像,如图:
执行docker run -it myip 返回结果如下:
4、我们知道curl -s https://ip.cn/api/index?ip=&type=0 能够返回请求的结果,但是当我们也需要返回http的头信息时,CMD指令就不行了
,因为我们知道docker run后面的参数会替换CMD指令后面的参数,这时ENTRYPOINT的作用就体现出来了,我们重新编写Dockerfile的指令,如下:
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s","https://ip.cn/api/index?ip=&type=0"]
重新执行docker build -f /mydocker/Dockerfile3 -t myip .(注意后面有一个点)构建镜像后,运行docker run -it myip -i,如图:
这样执行的命令就是 curl -s https://ip.cn/api/index?ip=&type=0 -i
5、总结:
CMD指令会覆盖
ENTRYPOINT指令是追加