CMD/ENTRYPOINT都是指定一个容器启动时要运行的命令。
CMD
功能:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。
示例(以tomcat为例):
tomcat的Dockerfile的最后一行是:
CMD ["catalina.sh", "run"]
运行命令:
docker run -it -p 7777:8080 tomcat:latest ls -l
结尾的ls -l相当于在Dockerfile最后加一行:
CMD ls -l
可以看出ls -l将CMD [“catalina.sh”, “run”]命令覆盖了,并没有启动tomcat
ENTRYPOINT
功能:docker run运行后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合。
示例:
制作可以查询ip的容器。
编写Dockerfile:
FROM centos
RUN yum -y install curl
CMD ["curl","-s","http://ip.cn"]
curl命令可以用来执行下载,发送各种HTTP请求,指定HTTP头部等操作。
构建镜像:
docker build -f ./mydocker/Dockerfile3 -t myip .
之后运行容器:
docker run -it myip
应该会显示ip地址。
curl命令如果要显示头部信息需要加-i参数,但docker run -it myip -i无法执行。
原因是docker run后的参数会覆盖最后一条CMD命令,所以这里应该使用ENTRYPOINT指令。