Dockerfile指令详解: CMD 容器启动命令
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 容器启动命令相关推荐
- Dockerfile 指令详解1
Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 复制 ...
- Docker学习——Dockerfile 指令详解(五)
2019独角兽企业重金招聘Python工程师标准>>> 我们已经介绍了 FROM (指定基础镜像) , RUN(执行命令) ,还提及了 COPY , ADD ,其实 Dockerfi ...
- 【Docker】之 Dockerfile 指令详解
目录 Dockerfile 基本结构 Dockerfile 指令 指定基础镜像 FROM 维护者信息 MAINTAINER 元数据标签 LABEL 设置环境变量 ENV 镜像构建参数 ARG 指定工作 ...
- Dockerfile指令详解镜像构建实例说明
Dockerfile使用总结 Dockerfile是用来构建镜像的文本文件,里面包含了一条条用于构建镜像所需的指令和说明. Dockerfiel文件中的每一层指令都是描述如何在上一层的基础上进行该层的 ...
- Docker之Dockerfile 指令详解
闲话不多说,dokerfile常用指令解析奉上 FROM 作用:指定基础镜像,必须放在DOckerfile的第一行,表示从哪个baseimage开始构建 格式: FROM <image>: ...
- Dockerfile 指令详解2
ENV 设置环境变量 格式有两种: ENV <key> <value> ENV <key1>=<value1> <key2>=<val ...
- Dockerfile指令详解:WORKDIR 指定工作目录
WORKDIR 指定工作目录 格式为 WORKDIR <工作目录路径>. 使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不 ...
- Dockerfile指令详解:ONBUILD 为他人作嫁衣裳
ONBUILD 为他人做嫁衣裳 格式:ONBUILD <其它指令>. ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不 ...
- Docker学习总结(32)——Dockerfile指令详解
1.ADD 复制文件 ADD指令用于复制文件,格式为: ADD <src>... <dest> ADD ["<src>",... "& ...
最新文章
- 解决PHP Fatal error mysql_connect() mysql_query()的问题
- 题目1132:与7无关的数
- Android中关于APK文件的下载、安装和卸载
- (转载)JDOM/XPATH编程指南
- 【SpringBoot 2】(十一)单元测试JUnit 5 指标监控
- 微生物组-宏基因组分析第8期 (报名直播课免费参加线下课2020.7,最后一周)
- MySQL中如何定义外键[转]
- 盈建科弹性板6计算_YJK参数设置详细解析
- oracle服务器结构01
- matlab从无到有系列(二):矩阵运算基础
- oppo弹出android截屏对话框,oppo手机如何截图 oppo手机快捷键截屏方法【教程】
- Java Vue uni-app 三端实现,滑动拼图验证码
- 人工智能---深度学习是什么
- busboy中文文件名乱码问题
- alexa与CISI指数—网站世界排名准则(转)
- 人生意义处,无限循环时
- ThinkPHP中的exp查询
- knn K近邻算法python实现
- 格式化字符串_列表_元组
- 网站性能优化时Cookie常用的优化方式
热门文章
- 怎么将多个html组合_技巧分享之在HTML元素中添加逼真阴影的教程
- “数据挖掘世界杯”KDD Cup不取消!全球顶尖AI团队必争之地!
- Debug Tensorflow: 随着训练进行,内存消耗越来越大
- pytorch随笔-6
- Kotlin实践(3)-入口 函数
- 玩双节棍的算法工程师:鱼佬的数据挖掘之路!
- 【机器学习】三层神经网络
- 收藏!!如何 Get 机器学习必备的算法技能? | 逻辑回归
- 谷歌又放大招:视觉效果完胜其他SOTA的风格迁移网络,手机端可达实时4K
- 网易云信亮相LiveVideoStackCon 2019,解读移动端播放器优化实践