Docker的CMD指令

CMD指令是Dockerfile中的一个重要指令,用于指定容器启动时执行的默认命令。CMD为容器运行时提供了一个默认的执行指令,可以在容器启动时自动运行该命令。

* CMD指令用于指定容器启动时的默认命令

CMD指令指定的命令通常是容器启动后要执行的主要进程。在Docker容器运行时,如果没有在docker run命令中指定其他命令,CMD指令中定义的命令将作为默认命令执行。

有三种常用的CMD指令格式:

  1. 命令行参数格式(exec form)
    这种格式会在容器启动时直接执行命令,并且不依赖于Shell的解析。该方式最常用,并且推荐使用,因为它不会通过Shell启动,避免了Shell的启动开销和不必要的Shell特性(如CMD ["sh", "-c", "echo hello"])。

    CMD ["executable", "param1", "param2"]
    

    示例:

    CMD ["python", "app.py"]
    

    在这个例子中,python app.py会作为容器启动时的默认命令执行。

  2. Shell格式(shell form)
    这种格式与在终端中直接执行命令相似,它会通过Shell(通常是/bin/sh -c)来执行命令。虽然这种形式比较简洁,但它会启用Shell,可能会受到Shell解释器的影响,因此不推荐用于需要完全控制执行环境的情况。

    CMD executable param1 param2
    

    示例:

    CMD python app.py
    

    这个例子与CMD ["python", "app.py"]效果相同,但启动过程中会通过Shell执行,可能会有一些额外的Shell行为。

  3. CMDENTRYPOINT结合使用
    CMDENTRYPOINT可以组合使用,从而允许容器在启动时使用ENTRYPOINT指定的命令,并且可以通过CMD提供默认参数。CMD提供的参数可以在docker run命令中被覆盖。

    ENTRYPOINT ["python"]
    CMD ["app.py"]
    

    在这种情况下,ENTRYPOINT指定了容器启动时默认运行python命令,而CMD则提供了默认参数app.py。因此,容器启动时默认运行的是python app.py。如果你在docker run时指定了其他参数,它们会替代CMD提供的参数。例如:

    docker run myimage test.py
    

    这将会运行python test.py,而不是python app.py

* CMD指令可以被docker run命令中的参数覆盖

虽然CMD为容器提供了一个默认命令,但它可以在运行容器时被docker run命令中的参数所覆盖。当使用docker run时,可以通过在命令行后添加新的命令或参数,覆盖掉CMD指令中定义的默认命令。

例如,假设Dockerfile中有以下内容:

CMD ["python", "app.py"]

然后你运行容器时可以覆盖这个默认命令:

docker run myimage python test.py

在这个例子中,容器会运行python test.py而不是python app.py,因为docker run中的命令覆盖了CMD指令。

* CMD指令与容器的生命周期

CMD指定的命令会成为容器的主进程,并且容器会保持运行直到该命令完成或终止。通常,这意味着CMD指定的命令应该是一个长期运行的进程(例如一个Web服务器或数据库服务),否则容器会在该命令执行完后退出。

如果容器中的进程结束,容器也会停止运行。这也是为什么容器通常用于托管长期运行的应用程序或服务,如Web应用、数据库、消息队列等。

* CMD指令的常见应用
  1. Web应用容器
    在许多Web应用容器中,CMD指令会启动一个Web服务器,作为容器的主进程。

    CMD ["python", "manage.py", "runserver"]
    
  2. 后台任务容器
    如果容器需要处理后台任务,可以使用CMD指令启动一个常驻进程,如Celery worker。

    CMD ["celery", "-A", "myapp", "worker"]
    
  3. 自定义启动命令
    在某些情况下,CMD指令可以与ENTRYPOINT一起使用,以便让用户能够自定义启动命令的参数,而不需要修改Dockerfile。例如,在基于Java的容器中,可以使用CMD来指定默认的JAR文件。

    ENTRYPOINT ["java", "-jar"]
    CMD ["myapp.jar"]
    
例子:使用CMD指令构建Python应用容器

假设你要创建一个Python应用的Docker镜像,Dockerfile可以是这样的:

# 使用官方Python 3.8基础镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 将当前目录的内容复制到容器的/app目录
COPY . /app

# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt

# 设置容器启动时的默认命令
CMD ["python", "app.py"]

在这个例子中,CMD指令指定了容器启动时运行的命令python app.py。这样,容器启动时会执行python app.py命令,如果需要,可以通过docker run命令覆盖它,传入其他Python脚本作为参数。

总结
  • CMD指令用于指定容器启动时执行的默认命令,帮助设置容器运行时的主进程。
  • CMD可以使用三种格式来指定命令,推荐使用命令行参数格式(exec form)。
  • CMD定义的命令可以在docker run命令中被覆盖,这使得容器在运行时更具灵活性。
  • CMD通常用于指定长时间运行的进程,如Web服务器或后台服务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务之松耦合

参考:https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…

pytest+request+yaml+allure搭建低编码调试门槛的接口自动化框架

接口自动化非常简单,大致分为以下几步: 准备入参调用接口拿到2中response,继续组装入参,调用下一个接口重复步骤3校验结果是否符合预期 一个优秀接口自动化框架的特点: 【编码门槛低】,又【能让新手学到…

基于Springboot + vue实现的文档管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径,并设置同步映射(1)配置服务器的系统环境(2)配置服务器的conda环境 4 进入到程序入口(main.py&#…

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK(Acknowledge) 2. NACK(Not Acknowledge) IO口模拟II2C协议 发送起始信号: 发送停止信号: 检测应答信号: 发送应答信号&#x…

Excel 技巧07 - 如何计算到两个日期之间的工作日数?(★)如何排除节假日计算两个日期之间的工作日数?

本文讲了如何在Excel中计算两个日期之间的工作日数,以及如何排除节假日计算两个日期之间的工作日数。 1,如何计算到两个日期之间的工作日数? 其实就是利用 NETWORKDAYS.INTL 函数 - weekend: 1 - 星期六,星期日 2,如…

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们,技术图文创作很不容易…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》,让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识,顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话,可以看看博主的C语言专栏哟&#xff…

智能物流升级利器——SAIL-RK3576核心板AI边缘计算网关设计方案(一)

近年来,随着物流行业智能化和自动化水平不断提升,数据的实时处理与智能决策成为推动物流运输、仓储管理和配送优化的重要手段。传统的集中式云平台虽然具备强大计算能力,但高延迟和带宽限制往往制约了物流现场的即时响应。为此,我…

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

【MySQL】简单解析一条SQL查询语句的执行过程

1. MySQL 的逻辑架构图 MySQL 架构主要分为 Server 层和存储引擎层。Server 层集成了连接器、查询缓存、分析器、优化器和执行器等核心组件&#xff0c;负责提供诸如日期、时间、数学和加密等内置函数&#xff0c;以及实现存储过程、触发器、视图等跨存储引擎的功能。存储引擎层…

如何将json字符串格式化

文章目录 如何对json字符串进行格式化显示hutool方案的示例和不足使用fastjson的方案 如何对json字符串进行格式化显示 将json字符串内容进行格式化的输出显示。本文介绍 hutool的方案和alibaba 的fastjson方案 hutool方案的示例和不足 引入依赖 <dependency><grou…

复杂 C++ 项目堆栈保留以及 eBPF 性能分析

在构建和维护复杂的 C 项目时&#xff0c;性能优化和内存管理是至关重要的。当我们面对性能瓶颈或内存泄露时&#xff0c;可以使用eBPF&#xff08;Extended Berkeley Packet Filter&#xff09;和 BCC&#xff08;BPF Compiler Collection&#xff09;工具来分析。如我们在Red…

unity学习18:unity里的 Debug.Log相关

目录 1 unity里的 Debug.log相关 2 用Debug.DrawLine 和 Debug.DrawRay画线 2.1 画线 1 unity里的 Debug.log相关 除了常用的 Debug.Log&#xff0c;还有另外2个 Debug.Log("Debug.Log"); Debug.LogWarning("Debug.LogWarning"); Debug.LogErro…

IoTDB 常见问题 QA 第三期

关于 IoTDB 的 Q & A IoTDB Q&A 第三期持续更新&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;查询最新值 & null 数据相加方…

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…

Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(上)

概述 Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0&#xff0c;它进一步完善了 Swift 语言的语法和语义&#xff0c;并再接再厉——强化了现代化并发模型的安全性和灵活性。 这里我们不妨用 Swift 来…

C++ STL之容器介绍(vector、list、set、map)

1 STL基本概念 C有两大思想&#xff0c;面向对象和泛型编程。泛型编程指编写代码时不必指定具体的数据类型&#xff0c;而是使用模板来代替实际类型&#xff0c;这样编写的函数或类可以在之后应用于各种数据类型。而STL就是C泛型编程的一个杰出例子。STL&#xff08;Standard …

VUE3 + Ant Design Vue4 开发笔记

异常记录 [Vue warn]: Extraneous non-props attributes (options) were passed to component but could not be automatically inherited because component renders fragment or text root nodes 定位原因解决方法 错误的中文释义&#xff1a;[Vue 警告]&#xff1a;传递给…