CMD 命令和 ENTRYPOINT 命令的区别

news2025/1/11 7:07:19

目录

    • CMD 命令
      • CMD-shell 形式
        • 1. 创建 Dockerfile1
        • 2. 构建和运行新镜像
        • 3. 覆盖 CMD
        • 4. 添加命令选项
      • CMD-exec形式
        • 1. 创建Dockerfile2、构建和运行新镜像
        • 2.覆盖 CMD和添加命令选项
    • ENTRYPOINT 命令
      • ENTRYPOINT-shell
        • 1. 创建Dockerfile3、构建和运行新镜像
        • 2. 覆盖 ENTRYPOINT 和 添加命令选项
      • ENTRYPOINT-exec
        • 1. 创建Dockerfile4、构建和运行新镜像
        • 2. 覆盖 ENTRYPOINT 和 添加命令选项
      • ENTRYPOINT-exec 的另一种写法
    • 基于前面五个实验的总结
    • CMD 与 ENTRYPOINT 组合使用

CMD 命令

CMD-shell 形式

1. 创建 Dockerfile1

vim Dockerfile1
# 写入以下两行内容
FROM centos:7
CMD cal

2. 构建和运行新镜像

# 说明:-f 用于指定本次构建所要使用的Dockerfile的文件名。
docker build -f Dockerfile1 -t my-cal:1.0 .

构建成功运行新镜像。运行后可以查看到当前月份的日历。

image-20230911102224504

3. 覆盖 CMD

image-20230911100132103

在 docker run 命令中指定要执行的命令,Dockerfile 中通过 CMD 指定的默认的命令就不会在执行,也就是说Dockerfile 中的 CMD 命令是可以被覆盖的。

4. 添加命令选项

image-20230911102303525

cal命令添加 -y 选项可以显示当前年的所有月份。但这种方式无法为 CMD 中指定的默认的命令指定选项。

小总结

cmd-shell的形式可以被覆盖,但不能添加命令选项。

CMD-exec形式

1. 创建Dockerfile2、构建和运行新镜像

此步骤与前面类似,只是把Dockerfile1里面的CMD cal 替换为CMD [“cal”] 或者CMD [“/bin/bash”, “-c”, “cal”]。

CMD-exec形式的语法:

CMD [“executable”,“param1”,“param2”]

  • “executable” 是你想要运行的命令或程序。
  • “param1”,“param2” 是传递给这个命令或程序的参数。

image-20230911102606406

image-20230911102631745

最后运行新镜像的结果和CMD-shell 形式的结果一样。

2.覆盖 CMD和添加命令选项

image-20230911102701172

小总结

cmd-exec的形式可以被覆盖,但不能添加命令选项。

ENTRYPOINT 命令

ENTRYPOINT-shell

1. 创建Dockerfile3、构建和运行新镜像

ENTRYPOINT-shell形式的语法:ENTRYPOINT command param1 param2

vim Dockerfile3
# 写入以下两行内容
FROM centos:7
ENTRYPOINT cal
# 构建镜像
docker build -f Dockerfile3 -t my-cal:3.0 .
# 运行镜像
docker run -it my-cal:3.0

结果如下:

image-20230911152434533

2. 覆盖 ENTRYPOINT 和 添加命令选项

image-20230911152648861

可以看到ENTRYPOINT-shell形式的指令是不会被 docker run 中指定的命令给覆盖掉的。在 docker run 中添加的命令选项,对于 ENTRYPOINT 中指定的命令是无效的。在这点上不像 CMD 指令一样报错。

ENTRYPOINT-exec

为了更好的理解ENTRYPOINT命令,ENTRYPOINT-exec又分了两种情况进行讨论。分别是ENTRYPOINT [“cal”] 和 ENTRYPOINT [“/bin/bash”,“-c”,“cal”] 。看看它们之间的区别有哪些以及为什么。

1. 创建Dockerfile4、构建和运行新镜像

vim Dockerfile4
# 写入以下两行内容
FROM centos:7
ENTRYPOINT ["cal"]
# 构建镜像
docker build -f Dockerfile4 -t my-cal:4.0 .
# 运行镜像
docker run -it my-cal:4.0

运行结果如下:

image-20230911153728227

2. 覆盖 ENTRYPOINT 和 添加命令选项

image-20230911153851075

可以看到这种的ENTRYPOINT-exec形式的指令也是不会被 docker run 中指定的命令给覆盖掉的,并且会报出错误信息。而在 docker run 中添加的命令选项,对于 ENTRYPOINT 中指定的命令却是是有效的,能够显示出整年的日历。

ENTRYPOINT-exec 的另一种写法

为了节省篇幅,我简要写出关键步骤后直接看运行结果。

# 建立Dockerfile5
vim Dockerfile5
# 写入以下两行内容
FROM centos:7
ENTRYPOINT ["/bin/bash","-c","cal"]
# 构建镜像
docker build -f Dockerfile5 -t my-cal:5.0 .
# 运行镜像
docker run -it my-cal:5.0

运行结果如下:

image-20230911154657701

覆盖 ENTRYPOINT 和 添加命令选项的结果如下:

image-20230911154753592

发现最后的结果与ENTRYPOINT-shell的形式一样。也就是不会被覆盖并且添加选项无效。

基于前面五个实验的总结

Dockerfile的命令命令是否可以被覆盖是否可以添加选项
CMD cal可以被覆盖不能添加选项,添加选项后会报错
CMD [“cal”]可以被覆盖不能添加选项,添加选项后会报错
ENTRYPOINT cal不可以被覆盖,添加的命令会被忽略不能添加选项,添加的选项被忽略
ENTRYPOINT [“cal”]不可以被覆盖,添加命令后会报错可以添加选项
ENTRYPOINT [“/bin/bash”,“-c”,“cal”]不可以被覆盖,添加的命令会被忽略不能添加选项,添加的选项被忽略

在总结之前先来看看docker run命令的语法:

image-20230911161656508

可以看到:IMAGE的后面是可以接命令和参数的,但命令和参数并不是必须的,所以用 [ ] 括起来了。所以结论如下:

  1. shell命令格式和exec命令格式的区别:

    对于 shell 形式的 ENTRYPOINT 或者 CMD,docker daemon 会创建一个新的 /bin/bash shell 进程,并在这个新进程中运行你的命令。这意味着你的命令会在一个新的 shell 环境中运行,这个环境有它自己的环境变量,且和启动容器的环境是隔离的。

    这与 exec 形式不同,exec 形式直接在 Docker 容器的主进程中运行命令,没有额外创建 shell 进程。这就是为什么 exec 形式可以接收 docker run 附加的参数。

  2. CMD指令:

    Dockerfile 中的 CMD 指令是可以被docker run 命令中的[COMMAND]替代的。也就是说,如果docker run命令中的 IMAGE 后仍有内容,此时docker daemon 首先会将IMAGE后面的[COMMAND]替换掉CMD指令中的[COMMAND],如果有两个或两个以上的内容,docker daemon会认为是从第二个内容开始后面的都是[ARG]。所以,添加的-y 会报错,这是因为没有-y 这样的[COMMAND]。

  3. ENTRYPOINT指令:

    如果Dockerfile中的[EXECUTABLE]是通过 ENTRYPOINT 指定的,则该镜像的启动命令 docker run 中是可以添加参数[ARG]的。也就是说,ENTRYPOINT指定的命令是不可被替代的,并且如果IMAGE后面还有内容,这些内容会被作为参数传递给ENTRYPOINT指定的命令。但加上参数后如果有语法错误,那么docker daemon就会忽略该参数。

最后的总结:基于以上三个结论,下面我就写一下每种命令执行的底层原理。

  1. 对于CMD-shell来说,首先docker daemon会fork一个新进程,该进程就是一个shell环境。如果docker run 命令后面的IMAGE没有命令和参数,那么docker daemon会将Dockerfile里面的CMD-shell命令放在这个新shell里面执行;如果docker run 命令后面的IMAGE有命令和参数,那么会将IMAGE后面的命令和参数放在新shell里面执行。在这个新的 shell 环境有它自己的环境变量,且和启动容器的环境是隔离的。
  2. 对于CMD-exec来说,命令的执行环境就是运行容器的主进程的环境。如果docker run 命令后面的IMAGE没有命令和参数,那么docker daemon会将Dockerfile里面的CMD-shell命令放在运行容器的主进程的环境执行;如果docker run 命令后面的IMAGE有命令和参数,那么IMAGE后面的命令和参数将会替换掉Dockerfile里面的CMD-exec命令,也就是只执行IMAGE后面的命令和参数
  3. 对于ENTRYPOINT-shell来说,首先docker daemon会fork一个新进程,该进程就是一个shell环境。如果docker run 命令后面的IMAGE没有命令和参数,那么docker daemon会将Dockerfile里面的 ENTRYPOINT-shell 命令放在这个新shell里面执行;如果docker run 命令后面的IMAGE有命令和参数,那对不起,IMAGE后面所有的命令和参数都会被丢弃
  4. 对于ENTRYPOINT-exec来说,命令的执行环境就是运行容器的主进程的环境。如果docker run 命令后面的IMAGE没有命令和参数,那么docker daemon会将Dockerfile里面的ENTRYPOINT-exec命令放在运行容器的主进程的环境执行;如果docker run 命令后面的IMAGE有命令和参数,那么docker daemon会将IMAGE后面所有的命令和参数追加到Dockerfile里面的ENTRYPOINT-exec命令的后面,但是如果追加后有语法错误,那么就不会追加了。最后在运行容器的主进程的环境执行命令
  5. 最后就是ENTRYPOINT [“/bin/bash”,“-c”,“cal”]的执行原理了,其实这有点类似于shell和exec两种形式的结合版,对于最后这个命令的底层执行原理请读者自行理解。不过需要注意的是cal -y的执行结果和/bin/bash -c cal -y的执行结果是不一样的;而 cal -y 和 /bin/bash -c “cal -y” 这两条命令的执行结果是一样的。

CMD 与 ENTRYPOINT 组合使用

这两个指令都用于指定容器启动时要执行的命令,无论哪个指令,每个 Dockerfile 中都只能有一个 CMD/ENTERYPOINT 指令,多个 CMD/ENTERYPOINT 指令只会执行最后一个。如果同时存在多个CMD 和 ENTRYPOINT,Docker 只会执行最后一个。此外,CMD 和 ENTRYPOINT 可以配合使用。当 ENTRYPOINT 和 CMD 同时存在时,CMD 中的内容会被作为 ENTRYPOINT 的参数。在这种模式下,docker run 命令后面的参数会覆盖 CMD 的内容。

验证如下:

# 新建Dockerfile6
vim Dockerfile6
# 写入以下三行内容
FROM centos:7
CMD ["hello world"]
ENTRYPOINT ["echo"]
# 构建镜像
docker build -f Dockerfile6 -t my-cal:6.0 .
# 运行镜像
docker run -it my-cal:6.0

运行结果如下:

image-20230911185712380

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云云耀云服务器L实例评测|了解配置和管理L型云服务器

华为云云耀云服务器L实例配置和管理教程 华为云云耀云服务器L实例的介绍概述特点优势与弹性云服务器(ECS)的对比 注册和创建L型云服务器注册华为云账号创建L型云服务器实例配置实例参数配置其他参数尝试登录 远程登录 L实例查看公网ip通过本地shell远程连…

QT Pyside2 Designer 的基本使用

文章目录 前言PySide2PySide2 Designer 一、安装PySide2、PyQt5二、使用designer.exe2.1 工具的大致介绍2.2 创建一个新的UI2.3 UI文件另存为/保存(CtrlS)2.4 使用python操作UI文件 总结 前言 PySide2 QT PySide2 是一个用于 Python 编程语言的开源框架,它提供了与…

【建站教程】使用阿里云服务器怎么搭建网站?

使用阿里云服务器快速搭建网站教程,先为云服务器安装宝塔面板,然后在宝塔面板上新建站点,阿里云服务器网以搭建WordPress网站博客为例,阿小云来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#x…

(10)(10.9) 术语表(一)

文章目录 前言 1 2.4Ghz 2 AGL 3 AHRS 4 APM 5 AMA 6 Arduino 7 APM (AutoPilot Mega) 8 ATC 9 Copter 10 Plane 11 Rover 12 BEC 13 Bootloader 14 COA 15 DCM 16 Eagle file 17 ESC 18 Firmware 19 FPV 20 FTDI 前言 !Note 术语表未编入索…

C++零碎记录(十二)

22. 菱形继承 22.1 菱形继承简介 ① 菱形继承概念: 1. 两个派生类继承同一个基类 2. 又有某个类同时继承两个派生类 3. 这种继承被称为菱形继承 ② 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据是,就会产生二义…

重构:在新底座之上让应用重生

应用重构正在开启一条云原生时代的新赛道。 数字化发展到今天,企业面临的挑战不仅来自技术层面,更来自认知层面。新架构、新应用正在重新定义数字生产力,重塑商业模式与市场核心竞争力。对金融行业来说,也是如此,一场…

计算机网络第六章——应用层(上)

人生若只如初见,何事秋风悲画扇 文章目录 基于服务的使用以及服务的提供而诞生的两个应用模型, 传输层提供一种端到端的服务,但是不同的网络应用的应用进程之间还需要有一些不同的通信规则,因此在传输层之上建立了一个应用层&am…

信息化管理工程验收评测规范

一、信息工程验收程序: 1.信息化建设项目验收分为初步验收和竣工验收两个阶段。验收由建设单位自行对照招标文件、投标文件和合同执行,并提交初验报告;企业与第三方联系实施验收。 2.工程试运行后30个工作日内,项目建设单位应将…

[计算机入门] 设置日期和时间

3.8 设置日期和时间 在任务栏的最右边是可以看到当前的日期和时间的。当然,如果这里的显示不对,也是可以进行设置的。 1、在任务栏的日期和时间位置,右键鼠标,在弹出的菜单中,点击调整日期/时间。 2、一般情况下&am…

easypoi和poi版本兼容问题记录

最近在开发导出word的功能,遇到下面的问题 提示xml报错的问题,我一度以为是项目换了java11造成的。经过询问朋友,得知有可能是版本冲突造成的,就猛然想起来,我的项目里面还引入了poi这个包。 于是我吧poi的版本降低到了…

【算法训练-数组 五】【二分查找】:旋转数组的最小数字、旋转数组的指定数字

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【数组的二分查找】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为…

C#,《小白学程序》第二十一课:大数(BigInteger)的四则运算之二,减法

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

GO语言网络编程(并发编程)Goroutine池

GO语言网络编程&#xff08;并发编程&#xff09;Goroutine池 1. Goroutine池 1.1.1. worker pool&#xff08;goroutine池&#xff09; 本质上是生产者消费者模型可以有效控制goroutine数量&#xff0c;防止暴涨需求&#xff1a; 计算一个数字的各个位数之和&#xff0c;例…

2.5 循环结构语句

在程序设计中&#xff0c;有时需要反复执行一段相同的代码&#xff0c;这时就需要使用循环结构来实现&#xff0c;Java语言提供了while循环、do-while循环、for循环。 一般情况下&#xff0c;一个循环结构包含四部分内容&#xff1a; 初始化部分&#xff0c;设置循环开始时变量…

正交试验设计法

正交实验设计 一、什么是正交试验设计法&#xff1f; 是一种成对测试交互的系统的统计方法。它提供了一种能对所有变量对的组合进行典型覆盖&#xff08;均匀分布&#xff09;的方法。 可以从大量的试验点中挑出适量的、有代表性的点&#xff0c;利用“正交表”&#xff0c;…

Rsync远程同步+inotify监控

一、rsync同步简介 一款快速增量备份工具 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09; 是一个开源的快速备份工具&#xff0c;可支持本地复制&#xff0c;或者与其他SSH,rsync主机同步。 cp&#xff1a;将原文件完整的复制到指定的路径下&#xff0c;而且…

Vector底层原理——面试之我答

Vector概述 vector是STL中最常用的容器&#xff0c;vector主要功能是作动态数组来弥补传统数组的缺点&#xff0c;如&#xff1a;不灵活&#xff0c;不方便插入等等。 Vector支持随机访问&#xff0c;因此访问某一个元素的时间复杂度是O(1)。 vector中存储着许多易用的函数方法…

自动化测试入门知识 —— 数据驱动测试

一、什么是数据驱动测试&#xff1f; 数据驱动测试是一种测试方法&#xff0c;它的核心思想是通过不同的测试数据来验证同一个测试逻辑。通常情况下&#xff0c;测试用例中的输入数据和预期结果会被提取出来&#xff0c;以便可以通过不同的测试数据进行重复执行。 数据驱动测…

spacy 中文语义分析下载安装使用

概念 spaCy 下载 安装spacy pip install -U spacy -i https://pypi.tuna.tsinghua.edu.cn/simple 安装模型 https://github.com/explosion/spacy-models/releases 找到对应的模型&#xff0c;下载&#xff0c;如下图 安装 下载是gz&#xff0c;下载后安装 pip instal…

Flullter学习第一天:什么是Flullter与Flullter安装

1.简介 Flutter使用dart作为主要开发语言,开发后可多端编译,并且能调用原生api 2.安装 官网:Install | Flutter 让我们读下为中国用户特制的文档,访问中国官网 Flutter: 为所有屏幕创造精彩 - Flutter 中文开发者网站 - Flutter 获取 Flutter SDK 点击下方的安装包&#x…