云计算-7-Dockerfile深度解析

CMD

CMD指令

Docker不是虚拟机,Docker镜像启动后就是容器,容器是进程,启动的时候需要指定运行的程序和参数,CMD指令的作用就是用于指定容器进程启动命令,其格式和我们之前在云计算-6-Dockerfile制作镜像中介绍的RUN指令很相似,有两种格式,三种写法:

  • shell格式:CMD command arg1 arg2

  • exec格式:CMD [“可执行文件”,“arg1”,“arg2”]

  • CMD [“agr1”,“arg2”],为 ENTRYPOINT 提供默认参数

例子1

vi mynginx

文件dockerfile内容

FROM nginx:1.21.6RUN echo '<h1>Welcome My Docker!</h1>' > /usr/share/nginx/html/index.htmlCMD echo 'hello docker'

打包镜像

docker build -t mynginx:v3  -f /root/mynginx_3 .

运行镜像

 docker run -it --name mynginx_3 -p 8083:80  mynginx:v3

结果

:如果添加**-d**,

 docker run -it --name mynginx_3 -p 8083:80 -d mynginx:v3

我们可以使用,docker logs查看容器日志

docker logs mynginx_3

结果为

例子2

我们使用以centos为基础镜像,使用yum的方式构建nginx,Dockerfile的进步如下:

FROM centosRUN cd /etc/yum.repos.d/ RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum clean allRUN yum install -y yum-utilsRUN yum install -y nginxRUN echo 'hello world' > /usr/share/nginx/html/index.htmlEXPOSE 80CMD ["/usr/sbin/nginx", "-g","daemon off;"]
  • 打包镜像
docker build -t mynginx:v1 .
  • 运行镜像
docker run -it --name mynginx_1  -p 8080:80 -d  mynginx:v1

查看结果

提示:

很多人在上面的Dockerfile中经常将cmd写为

CMD service nginx start

然后发现容器执行后立即退出了,甚至还在容器中使用systemctl命令,然后发现这个命令执行不了,这主要是没有分清楚前后台概念,没有区分容器和虚拟机的差异

对于容器,他启动程序就是容器的应用进程,容器就是为主进程存在的,主进程退出,容器就也退出了。

如果使用 CMD service nginx start 实际上就是使用

CMD ['sh','-c','service nginx start']

主进程实际上就是sh,当service nginx start命令结束, sh主进程也就结束了,容器自然就退出了。

ENTRYPOINT

ENTRYPOINT指令

ENTRYPOINT的格式和RUN的指令是一样的,分为 exec 格式和 shell 格式:

  • shell格式:command param1 param2 (shell 形式)

  • exec格式:ENTRYPOINT [“executable”, “param1”, “param2”] ( exec 方式, 首选方式)

ENTRYPOINT目的和CMD一样,都是在指定容器启动程序和启动程序的参数,在运行时参数可以替代

例子3

FROM centosRUN cd /etc/yum.repos.d/RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum clean allRUN yum install -y yum-utils#RUN yum makecache fastRUN yum install -y nginxRUN echo 'hello world' > /usr/share/nginx/html/index.htmlEXPOSE 80ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]

如果我们启动nginx的时候想查看nginx的版本

此处的-v,就是nginx -v。

当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:

<ENTRYPOINT> "<CMD>"

例子四

FROM centosRUN cd /etc/yum.repos.d/RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum clean allRUN yum install -y yum-utils#RUN yum makecache fastRUN yum install -y nginxRUN echo 'hello world' > /usr/share/nginx/html/index.htmlEXPOSE 80CMD ["-g","daemon off;"]ENTRYPOINT ["/usr/sbin/nginx"]

实际例子4含义和例子三是一样的。

提示

只能有一个CMD

  • Dockerfile中只能有一条CMD指令。如果您列出多个CMD,则只有最后一个CMD才会生效。

  • CMD的主要目的是为执行中的容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。

CMD为ENTRYPOINT提供默认参数

  • 如果使用CMD为ENTRYPOINT指令提供默认参数,则CMD和ENTRYPOINT指令均应使用JSON数组格式指定。

docker run启动参数会覆盖CMD内容

# 一个示例 FROM alpine LABEL maintainer=leifengyang CMD ["1111"] ENTRYPOINT ["echo"] #构建出如上镜像后测试 docker run xxxx:什么都不传则 echo 1111echo 1111 docker run xxx arg1:传入arg1 则echo arg1

云计算-7-Dockerfile深度解析CMD和ENTRYPOINT指令相关推荐

  1. Dockerfile中的CMD和ENTRYPOINT有什么区别?

    本文翻译自:What is the difference between CMD and ENTRYPOINT in a Dockerfile? In Dockerfiles there are tw ...

  2. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  3. Dockerfile 中的 CMD 和 ENTRYPOINT 有什么区别

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  4. Dockerfile脚本:CMD与ENTRYPOINT的区别

    CMD & ENTRYPOINT ENTRYPOINT使用 FROM centos RUM yum install -y curl #ENTRYPOINT ["curl", ...

  5. Dockerfile ENTRYPOINT指令 语法解析

      系列博文之前讲解过RUN和CMD,其中CMD可以作为容器启动时的默认命令使用,而ENTRYPOINT是位于CMD之上的命令,同样可以可以设置容器启动时的入口点,可以使用ENTRYPOINT做许多系 ...

  6. Dockerfile 的 CMD 与 ENTRYPOINT 傻傻分不清楚

    CMD 和 ENTRYPOINT 指令都是用来指定容器启动时运行的命令. 单从功能上来看,这两个命令几乎是重复的.单独使用其中的一个就可以实现绝大多数的用例.但是既然 doker 同时提供了它们,为了 ...

  7. Dockerfile中CMD和ENTRYPOINT命令详解

    原文:https://m.jb51.net/article/136264.htm Dockerfile中CMD和ENTRYPOINT命令详解 发布时间:2018-03-12 11:46:00 作者:s ...

  8. Dockerfile CMD和ENTRYPOINT

    Dockerfile中的CMD和ENTRYPOINT 首先CMD和ENTRYPOINT这两个指令都是用来指定容器启动时运行的命令. 单从功能上来看,这两个命令几乎是重复的.单独使用其中的一个就可以实现 ...

  9. Dockerfile中CMD和ENTRYPOINT区别

    CMD指令和ENTRYPOINT指令的作用都是为镜像指定容器启动后的命令,那么它们两者之间有什么各自的优点呢? 为了更好地对比CMD指令和ENTRYPOINT指令的差异,我们这里再列一下这两个指令的说 ...

最新文章

  1. Python知识:实用程序模块基础——OS模块
  2. mysql服务器配置优化
  3. Easyexcel文件下载时,中文名称显示为下划线
  4. 使用Django搭建web服务器(最最正确的方式)
  5. linux mysql select_MySQL-Select语句高级应用
  6. 测试centos x64 6.2安装oracle 11G
  7. 三种跨线程控件访问方法
  8. MOT with a hierachical single branch network
  9. 会走索引吗 oracle_茅台酒会走兰花的老路吗?
  10. BootDo平台数据库使用Oracle
  11. 极光推送java demo_极光推送JAVA代码示例
  12. Markdown中如何添加特殊符号
  13. linux屏幕怎么暗一点,Ubuntu 12.10 调节屏幕亮度经验分享
  14. vim 录制宏,自动循环执行组合操作
  15. C#访问大华网络摄像头
  16. Jetson嵌入式系列模型部署-3
  17. 嵌入式裸机课程之C语言程序调用和重定位学习笔记
  18. ie8不兼容jquery的html,IE8不支持jQuery版本的解决方法
  19. launcher切页动画
  20. python项目对接腾讯云发送短信

热门文章

  1. 牛客小白月赛25 D.抽卡
  2. 大学计算机专业可以用台式电脑吗,大学带台式机的人多吗 方便吗
  3. 编程题-翻棋游戏-枚举
  4. ffmpeg如何进行高清图片转码,截取视频
  5. 《NK细胞培养扩增解决方案》
  6. Hadoop之——机架感知配置
  7. 漫画:生命游戏(头条、Google 面试题)
  8. 3.3 计算球的体积
  9. 开源顺顺表格excel电子表格控件免费下载
  10. python爬虫---一键采集ftx网站上的所有房源信息