您当前的位置: 首页 >  docker

小志的博客

暂无认证

  • 1浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

DockerFile解析——CMD/ENTRYPOINT镜像案例

小志的博客 发布时间:2019-07-15 17:32:28 ,浏览量:1

一、DockerFile体系结构(保留字指令)CMD和ENTRYPOINT 作用

都是指定一个容器启动时要运行的命令

二、CMD

Dockerfile 中可以有多个 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命令替换,所以没有启动成功。

三、ENTRYPOINT

docker 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

运行结果如下: 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0670s