CMD
指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被 docker run之后的参数替换
ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
验证
验证中使用的命令为curl
首先编写Dockerfile文件,内容如下:
FROM centos:7
RUN yum -y install curl
CMD ["curl","-s","https://ip.cn"]
build构建新的镜像
[root@localhost myDocker]# docker build -f /myDocker/DockerfileTree -t myip .
Sending build context to Docker daemon 4.096kB
Step 1/3 : FROM centos:7
---> 5e35e350aded
Step 2/3 : RUN yum -y install curl
---> Running in cb4a10126aa2
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirror.bit.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Package curl-7.29.0-54.el7.x86_64 already installed and latest version
Nothing to do
Removing intermediate container cb4a10126aa2
---> 88d37e3c7f89
Step 3/3 : CMD ["curl","-s","https://ip.cn"]
---> Running in 80b594b5d5ae
Removing intermediate container 80b594b5d5ae
---> 38e3d380c971
Successfully built 38e3d380c971
Successfully tagged myip:latest
运行容器
[root@localhost myDocker]# docker run myip
{"ip": "118.113.40.151", "country": "四川省成都市", "city": "电信"}
现在需要在原有的 curl -s https://ip.cn
后面追加一个-i
得到报文头
[root@localhost myDocker]# docker run myip -i
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"-i\": executable file not found in $PATH": unknown.
可以看到,
CMD
后面的命令,会被docker run后面的命令覆盖掉,也就是我刚才写的-i
测试ENTRYPOINT
指令,方法一样,只不过构建文件的最后CMD
替换为ENTRYPOINT
FROM centos:7
RUN yum -y install curl
ENTRYPOINT ["curl","-s","https://ip.cn"]
build新镜像
[root@localhost myDocker]# docker build -f /myDocker/DockerfileFour -t myip2 .
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM centos:7
---> 5e35e350aded
Step 2/3 : RUN yum -y install curl
---> Using cache
---> 88d37e3c7f89
Step 3/3 : ENTRYPOINT ["curl","-s","https://ip.cn"]
---> Running in 41efe0250802
Removing intermediate container 41efe0250802
---> 0c174d9b9d07
Successfully built 0c174d9b9d07
Successfully tagged myip2:latest
运行myip2
[root@localhost myDocker]# docker run myip2
{"ip": "118.113.40.151", "country": "四川省成都市", "city": "电信"}
在末尾添加-i
[root@localhost myDocker]# docker run myip2 -i
HTTP/1.1 200 OK
Date: Mon, 25 Nov 2019 13:56:30 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d66201e01a5389c244826811f2a98b9d31574690190; expires=Wed, 25-Dec-19 13:56:30 GMT; path=/; domain=.ip.cn; HttpOnly
CF-Cache-Status: DYNAMIC
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 53b4205b9fc8eb91-LAX
{"ip": "118.113.40.151", "country": "四川省成都市", "city": "电信"}
可以证明
ENTRYPOINT
后面的写的命令,并没有被我后面添加的-i
指令覆盖,而是被追加在了后面,相当于最后的命令变为了curl -s https://ip.cn -i