CMD 容器启动命令

CMD 指令的格式和 RUN 相似,也是两种格式:

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
  • 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

之前介绍容器的时候曾经说过,Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。

在运行时可以指定新的命令来替代镜像设置中的这个默认命令,比如,ubuntu 镜像默认的 CMD/bin/bash,如果我们直接 docker run -it ubuntu 的话,会直接进入 bash。我们也可以在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release。这就是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息。

在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号。

如果使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

CMD echo $HOME

在实际执行中,会将其变更为:

CMD [ "sh", "-c", "echo $HOME" ]

这就是为什么我们可以使用环境变量的原因,因为这些环境变量会被 shell 进行解析处理。

提到 CMD 就不得不提容器中应用在前台执行和后台执行的问题。这是初学者常出现的一个混淆。

Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,用 systemd 去启动后台服务,容器内没有后台服务的概念。

一些初学者将 CMD 写为:

CMD service nginx start

然后发现容器执行后就立即退出了。甚至在容器内去使用 systemctl 命令结果却发现根本执行不了。这就是因为没有搞明白前台、后台的概念,没有区分容器和虚拟机的差异,依旧在以传统虚拟机的角度去理解容器。

对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。

而使用 service nginx start 命令,则是希望 upstart 来以后台守护进程形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。

正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:

CMD ["nginx", "-g", "daemon off;"]

参考链接:https://www.kancloud.cn/docker_practice/docker_practice/469789

Dockerfile指令详解: CMD 容器启动命令相关推荐

  1. Dockerfile 指令详解1

    Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 复制 ...

  2. Docker学习——Dockerfile 指令详解(五)

    2019独角兽企业重金招聘Python工程师标准>>> 我们已经介绍了 FROM (指定基础镜像) , RUN(执行命令) ,还提及了 COPY , ADD ,其实 Dockerfi ...

  3. 【Docker】之 Dockerfile 指令详解

    目录 Dockerfile 基本结构 Dockerfile 指令 指定基础镜像 FROM 维护者信息 MAINTAINER 元数据标签 LABEL 设置环境变量 ENV 镜像构建参数 ARG 指定工作 ...

  4. Dockerfile指令详解镜像构建实例说明

    Dockerfile使用总结 Dockerfile是用来构建镜像的文本文件,里面包含了一条条用于构建镜像所需的指令和说明. Dockerfiel文件中的每一层指令都是描述如何在上一层的基础上进行该层的 ...

  5. Docker之Dockerfile 指令详解

    闲话不多说,dokerfile常用指令解析奉上 FROM 作用:指定基础镜像,必须放在DOckerfile的第一行,表示从哪个baseimage开始构建 格式: FROM <image>: ...

  6. Dockerfile 指令详解2

    ENV 设置环境变量 格式有两种: ENV <key> <value> ENV <key1>=<value1> <key2>=<val ...

  7. Dockerfile指令详解:WORKDIR 指定工作目录

    WORKDIR 指定工作目录 格式为 WORKDIR <工作目录路径>. 使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不 ...

  8. Dockerfile指令详解:ONBUILD 为他人作嫁衣裳

    ONBUILD 为他人做嫁衣裳 格式:ONBUILD <其它指令>. ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不 ...

  9. Docker学习总结(32)——Dockerfile指令详解

    1.ADD 复制文件 ADD指令用于复制文件,格式为: ADD <src>... <dest> ADD ["<src>",... "& ...

最新文章

  1. 解决PHP Fatal error mysql_connect() mysql_query()的问题
  2. 题目1132:与7无关的数
  3. Android中关于APK文件的下载、安装和卸载
  4. (转载)JDOM/XPATH编程指南
  5. 【SpringBoot 2】(十一)单元测试JUnit 5 指标监控
  6. 微生物组-宏基因组分析第8期 (报名直播课免费参加线下课2020.7,最后一周)
  7. MySQL中如何定义外键[转]
  8. 盈建科弹性板6计算_YJK参数设置详细解析
  9. oracle服务器结构01
  10. matlab从无到有系列(二):矩阵运算基础
  11. oppo弹出android截屏对话框,oppo手机如何截图 oppo手机快捷键截屏方法【教程】
  12. Java Vue uni-app 三端实现,滑动拼图验证码
  13. 人工智能---深度学习是什么
  14. busboy中文文件名乱码问题
  15. alexa与CISI指数—网站世界排名准则(转)
  16. 人生意义处,无限循环时
  17. ThinkPHP中的exp查询
  18. knn K近邻算法python实现
  19. 格式化字符串_列表_元组
  20. 网站性能优化时Cookie常用的优化方式

热门文章

  1. 怎么将多个html组合_技巧分享之在HTML元素中添加逼真阴影的教程
  2. “数据挖掘世界杯”KDD Cup不取消!全球顶尖AI团队必争之地!
  3. Debug Tensorflow: 随着训练进行,内存消耗越来越大
  4. pytorch随笔-6
  5. Kotlin实践(3)-入口 函数
  6. 玩双节棍的算法工程师:鱼佬的数据挖掘之路!
  7. 【机器学习】三层神经网络
  8. 收藏!!如何 Get 机器学习必备的算法技能? | 逻辑回归
  9. 谷歌又放大招:视觉效果完胜其他SOTA的风格迁移网络,手机端可达实时4K
  10. 网易云信亮相LiveVideoStackCon 2019,解读移动端播放器优化实践