一、DockerFile体系结构(保留字指令)CMD和ENTRYPOINT 作用
都是指定一个容器启动时要运行的命令
二、CMDDockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
1、以tomcat的讲解演示
- 查看docker hub上的tomcat的dockerfile文件,tomcat的dockerfile文件地址,在结尾处有CMD命令,如下图:
- 查看tomcat镜像,并运行tomcat镜像。
[root@localhost]# docker images tomcat
[root@localhost]# docker run -it -p 7777:8080 tomcat
- 在启动tomcat命令后追加ls -l
[root@localhost]# docker run -it -p 7777:8080 tomcat ls -l
运行结果如下:
[root@localhost]# docker ps
运行结果如下: 说明tomcat没有启动。
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
tomcat的dockerfile文件周后一行的CMD [“catalina.sh”, “run”]命令, 被 docker run 之后的参数ls -l命令替换,所以没有启动成功。
三、ENTRYPOINTdocker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合
1、制作CMD版可以查询IP信息的容器(crul命令详细解释请点击此处连接)
[root@localhost mydocker]# pwd
/mydocker
[root@localhost mydocker]#vim Dockerfile3
#继承自centos
FROM centos
#安装curl
RUN yum install -y curl
#执行curl -s命令 http://ip.cn是一个查ip的网址
CMD [ "curl", "-s", "http://ip.cn" ]
[root@localhost mydocker]#docker build -f /mydocker/Dockerfile3 -t myip .
[root@localhost mydocker]#
运行结果如下:
[root@localhost mydocker]# docker images myip
运行如下图:
[root@localhost mydocker]# docker run myip
当前 IP :21.241.251.153 来自 : 北京市 电信
2、问题
如果我们希望显示 HTTP 头信息,就需要加上 -i 参数
[root@localhost]# crul -s http://ip.cn
当前 IP :21.241.251.153 来自 : 北京市 电信
[root@localhost]# crul -s -i http://ip.cn
当前 IP :21.241.251.153 来自 : 北京市 电信
运行结果如下图: 3、docker run后面追加-i参数,我们可以看到可执行文件找不到的报错,executable file not found。
[root@localhost mydocker]# docker run myip
当前 IP :21.241.251.153 来自 : 北京市 电信
[root@localhost mydocker]# docker run myip -i
运行结果如下: 4、why
- 我们可以看到可执行文件找不到的报错,executable file not found。
- 之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。
- 因此这里的 -i 替换了原来的 CMD,而不是添加在原来的 curl -s http://ip.cn 后面。而 -i 根本不是命令,所以自然找不到。
- 那么如果我们希望加入 -i 这参数,我们就必须重新完整的输入这个命令:$ docker run myip curl -s http://ip.cn -i
5、制作ENTROYPOINT版查询IP信息的容器
[root@localhost mydocker]# pwd
/mydocker
[root@localhost mydocker]#vim Dockerfile4
#继承自centos
FROM centos
#安装curl
RUN yum install -y curl
#执行curl -s命令 http://ip.cn是一个查ip的网址
ENTROYPOINT [ "curl", "-s", "http://ip.cn" ]
[root@localhost mydocker]#docker build -f /mydocker/Dockerfile4 -t myip2 .
[root@localhost mydocker]#
运行结果如下:
[root@localhost mydocker]# docker run myip2
当前 IP :21.241.251.153 来自 : 北京市 电信
[root@localhost mydocker]# docker run myip2 -i
运行结果如下: