首页 > 其他分享 >CMD指令详解

CMD指令详解

时间:2023-04-28 09:57:16浏览次数:30  
标签:容器 RUN CMD redis 指令 ENTRYPOINT 详解

Dockerfile 中只能有一条CMD指令。如果列出多个,CMD 则只有最后一个CMD会生效。CMD 主要目的是为运行容器时提供默认值。

Docker 不是虚拟机,容器就是进程,CMD 指令就是用于指定默认的容器主进程的启动命令的。在启动(运行)一个容器时可以指定新的命令来替代镜像设置中的这个默认命令。

可以包含可执行文件,当然也可以省略。CMD 指令的格式和 RUN 相似,也是两种格式:

shell 格式:CMD <命令>exec 格式:CMD ["可执行文件", "参数1", "参数2"...]参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。 注意:不要混淆RUN 和 CMD。RUN实际上运行一个命令并提交结果; CMD在构建时不执行任何操作,但指定镜像的默认命令。

插个小消息,也方便想学习的同学,在文章下方留言即可试听课程外加领取千锋HTML5、UI交互设计、PHP、Java+云数据、大数据开发、VR/AR/Unity游戏开发、Python人工智能、Linux云计算、全栈软件测试、网络安全等全部的视频学习教程。

Docker 不是虚拟机,容器内没有后台服务的概念。不要期望这样启动一个程序到后台:

CMD systemctl start nginx

这行被 Docker 理解为:

CMD ["sh" "-c" "systemctl start nginx"]

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

就像上面的示例中,主进程是 sh , 那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会使容器退出。

正确的做法是直接执行 nginx 这个可执行文件,并且关闭后台守护的方式,使程序在前台运行。

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

ENTRYPOINT 指令

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器的启动程序及参数。

ENTRYPOINT 在运行时也可以被替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。

ENTRYPOINT 的格式和 RUN 指令格式一样,也分为 exec 格式和 shell 格式。

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

""

有了 CMD 后,为什么还要有 ENTRYPOINT 呢?

这种 "" 给我们带来了什么好处么?

让我们来看几个场景。

场景一:让镜像变成像命令一样使用 CMD 方式

FROM centos

RUN yum update \

&& yum install -y curl

CMD [ "curl", "-s", "ip.cn" ]

构建镜像后, 运行容器

docker run --rm centos-echo-ip-cmd
执行下面命令会报错

docker run --rm centos-echo-ip-cmd -i
我们可以看到报错,executable file not found。之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。因此这里的 -i 并不是添加在原来的 curl -s ip.cn 后面。 而是替换了原来的 CMD,变成了 CMD ["-i"],而 -i 根本不是命令,所以报了可执行文件找不到。

所以应该使用 ENTRYPOINT 方式

FROM centos

RUN yum install -y curl

ENTRYPOINT ["curl", "-s", "ip.cn"]

再次构建镜像后, 运行容器

docker run --rm centos-echo-ip-entrypoint
docker run --rm centos-echo-ip-entrypoint -i
这样的话, 最终的指令就变成 ENTRYPOINT ["curl", "-s", "ip.cn", "-i"]

场景二:应用运行前的准备工作 启动容器就是启动主进程,但有些时候,启动主进程前,需要一些准备工作。

官方镜像 redis 中的示例:

FROM alpine:3.4

RUN addgroup -S redis && adduser -S -G redis redis

ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 6379

CMD [ "redis-server" ]

可以看到其中为 redis 服务创建了 redis 用户,并在最后指定了 ENTRYPOINT 为 docker-entrypoint.sh 脚本。

#!/bin/sh

allow the container to be started with --user
if [ "

 

(id -u)" = '0' ]; then

chown -R redis .

exec gosu redis "

 

@"

fi

exec "$@"

该脚本的内容就是根据 CMD 的内容来判断,如果是 redis-server 的话,则切换到 redis 用户身份启动服务器,否则依旧使用 root 身份执行。比如:

$ docker run -it redis id

uid=0(root) gid=0(root) groups=0(root)

还有 ENTRYPOINT 指令不会被 RUN 指令覆盖,而 CMD 指令会被 RUN 指令覆盖。

标签:容器,RUN,CMD,redis,指令,ENTRYPOINT,详解
From: https://www.cnblogs.com/qian-fen/p/17360993.html

相关文章

  • 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介策略模式(StrategyPattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。当你想使用对象中各种不同的算法变体,使用if...else所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅在执行某些行为时......
  • Vue的生命周期的详解
    Vue的生命周期   Vue的生命周期是每个使用Vue框架的前端人员都需要掌握的知识,以此作为记录。  Vue的生命周期就是vue实例从创建到销毁的全过程,也就是newVue()开始就是vue生命周期的开始。Vue实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom-......
  • Halcon Variation_model 详解
    介绍使用Halcon的差异模型进行检测,主要分为下面的四个步骤:create_shape_model创建检测的区域匹配模板注:这里使用形状匹配模板,当然也可以通过其它的匹配算法实现create_variation_model创建差异模型rain_variation_model训练正常图像prepare_variation_model......
  • 【汇编学习】指令对标志寄存器的影响总结
    转载自百度网盘指令类型助记符(带*为特权指令)对标志寄存器的影响备注说明举例ZFCFPFSFOFAFDFIFTF数据传送类数据传送MOV不影响标志位 MoveMOVr/m32,imm32MOV* Moveto/fromControlReg......
  • (四) DOS的原理和相关指令
    目录DOS介绍常见的DOS命令创建删除文件夹列出当前目录内容切换目录列出字文件夹清屏DOS介绍DOS:DiskOpreatingSystem磁盘操作系统常见的DOS命令创建删除文件夹mdG:\\tmp#创建一个叫tmp的文件夹rdG:\tmp#删除G盘tmp文件夹列出当前目录内容dird:\abc#列......
  • ipset命令详解
    Centos7ipset命令介绍及使用  ipset介绍iptables是在linux内核里配置防火墙规则的用户空间工具,它实际上是netfilter框架的一部分。可能因为iptables是netfilter框架里最常见的部分,所以这个框架通常被称为iptables,iptables是linux从2.4版本引入的防火墙解决方案。ip......
  • 编程开发8大语言详解,为什么Java是我最推荐的?
    一.前言很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会。当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到的两种声音。在此,平哥需要给大家科普一下,编程确实改变了这个世界,但这是所有编程人......
  • 火山引擎 DataLeap 下 Notebook 系列文章三:架构升级详解
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群当使用Notebook的项目日渐增加时,火山引擎DataLeap研发团队发现运行中的PaaS服务实在太多了,之前的架构有如下缺点:部署麻烦。全量升级JupyterLab较为痛苦。尽管有升级脚本,但是通过A......
  • MySQL锁机制详解-表锁与行锁
    转、MySQL锁机制详解-表锁与行锁https://blog.csdn.net/huangjhai/article/details/119011417  转:什么是线程死锁?如何避免死锁? 相互强占彼此资源,导致彼此等待。线程挂起 阻塞......
  • CutMix&Mixup详解与代码实战
    摘要:本文将通过实践案例带大家掌握CutMix&Mixup。本文分享自华为云社区《CutMix&Mixup详解与代码实战》,作者:李长安。引言最近在回顾之前学到的知识,看到了数据增强部分,对于CutMix以及Mixup这两种数据增强方式发现理解不是很到位,所以这里写了一个项目再去好好看这两种数据增强方......