dockerfile用ENTRYPOINT好还是用CMD好

2023-09-19 10:42:34

在 Dockerfile 中使用 `ENTRYPOINT` 和 `CMD` 都有其用途和优劣势,具体取决于你的应用和需求。这两个指令的主要区别在于如何处理容器启动时的命令参数。

1. `CMD` 指令:
   - `CMD` 用于定义容器启动时的默认命令,但它可以在运行容器时被替代。如果在运行容器时提供了命令参数,那么这些参数会覆盖 `CMD` 中定义的默认命令。
   - `CMD` 通常用于指定应用程序的启动命令以及默认的启动参数。

   示例 Dockerfile 使用 `CMD`:
   ```Dockerfile
   FROM ubuntu
   CMD ["echo", "Hello, World"]
   ```

   这个容器默认启动时会运行 `echo Hello, World`。

2. `ENTRYPOINT` 指令:
   - `ENTRYPOINT` 用于指定容器启动时要执行的命令。与 `CMD` 不同,`ENTRYPOINT` 的命令不会被轻易替代,而是作为容器的主要执行命令。
   - 如果你在运行容器时提供了命令参数,它们会被附加到 `ENTRYPOINT` 指定的命令后面,而不是替代它。

   示例 Dockerfile 使用 `ENTRYPOINT`:
   ```Dockerfile
   FROM ubuntu
   ENTRYPOINT ["echo", "Hello, World"]
   ```

   这个容器默认启动时也会运行 `echo Hello, World`,但你可以在运行容器时添加额外的参数,例如:
   ```bash
   docker run my-container "Custom Greeting"
   ```

   这会输出 "Hello, World Custom Greeting",`"Custom Greeting"` 是添加到 `ENTRYPOINT` 命令后面的参数。

如何选择取决于你的需求:
- 如果你希望容器的主要目的是运行一个特定的应用程序,并且通常不需要更改启动命令,那么使用 `ENTRYPOINT` 可能更合适,因为它提供了更严格的命令执行方式。
- 如果你希望容器的启动命令更加灵活,可以在运行容器时轻松更改,那么 `CMD` 可能更适合,因为它允许更容易地替代默认命令。

你还可以将它们结合使用,`ENTRYPOINT` 定义应用程序的主要入口点,而 `CMD` 提供默认参数。这种方式可以为容器提供一些默认行为,同时也保留了运行容器时的灵活性。例如:

```Dockerfile
FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello, World"]
```

在这种情况下,默认情况下容器会运行 `echo Hello, World`,但你仍然可以在运行容器时提供其他参数来修改命令的行为。

更多推荐

[论文阅读]A ConvNet for the 2020s

摘要视觉识别的咆哮的20年代开始于ViTs的引入,它很快取代了卷积神经网络,成为最先进的图像分类模型。另一方面,一个原始的ViT在用于一般的比如目标识别和语义分割的计算机视觉任务的时候面临困难。层次Transformer(例如,Swin-Transformer),它重新引入了几个卷积神经网络先验,使Transforme

成绩查询解决方案

老师如果想要使用PHP代码创建一个查询系统,可以按照以下步骤进行操作:建立数据库连接:首先,你需要使用PHP的数据库扩展(如MySQLi或PDO)来建立与数据库的连接。提供数据库的主机名、用户名、密码和数据库名称。创建数据库表:使用SQL语句创建用于存储查询数据的表。表中应该包含用于查询的字段,如ID、名称、描述等。创

ELK 企业级日志分析系统

----------------------ELK概述----------------------------------------1、ELK简介ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求

2023-09-18 monetdb-GDK和BAT-分析与思考

摘要:GDK作为moentdb的最核心的内核,可以看作是物理计划的执行,以及与磁盘IO直接进行交互.而物理列的数据结构,就是BAT.所以GDK也可以看作是对BAT的操作的模块,BAT是GDK操作的对象,是GDK的一部分.GDK和BAT的名字其实无关紧要,重要的是这些模块所承载的功能.GDK:monetdb的最核心的内核

数据结构——二叉搜索树

二叉搜索树是二叉树的一种特殊形式。二叉搜索树具有以下性质:1.每个节点中的值必须大于(或等于)其左侧子树中的任何值2.每个节点中的值必须小于(或等于)其右侧子树中的任何值。像普通的二叉树一样,我们可以按照前序、中序和后序来遍历一个二叉搜索树。但是值得注意的是,对于二叉搜索树,我们可以通过中序遍历得到一个递增的有序序列。

Arm发布 Neoverse V2 和 E2:下一代 Arm 服务器 CPU 内核

9月14日,Arm发布了新的处理器内核:V2和E2,在官网已经可以看到相关的TRM手册了。。四年前,Arm发布了Neoverse系列的CPU设计。Arm决定加大力度进军服务器和边缘计算市场,专门为这些市场设计ArmCPU内核,而不仅仅是回收以消费者为中心的Cortex-A设计。因此,Arm开始以更积极的方式进军基础设施

《C++ primer plus》精炼(OOP部分)——对象和类(5)

“学习是照亮心灵的火炬,它永不熄灭,永不止息。”文章目录类的自动和强制类型转换原始类型转换为自定义类型将自定义类型转换为原始类型类的自动和强制类型转换原始类型转换为自定义类型可以用一个参数的构造函数来实现,例如:classStudent{strings;intgrade;Student(inti);}intmain(v

用php&&redis发布订阅模式实现批量发送短信

使用Redis的发布订阅模式来实现批量发送短信是一种有效的方式,可以将短信任务发布到一个频道,然后多个订阅者(短信发送程序)从该频道获取任务并执行发送。以下是几个示例,演示如何使用Redis的发布订阅模式来实现批量发送短信:注意:以下示例为演示代码,实际应用中可能需要更多的错误处理、性能优化和安全措施。发布者-将短信任

直播流⻚⾯内存优化⽅案

本文字数:6628字预计阅读时间:39分钟01项目背景介绍项目中直播流每场直播由一张直播图片作为展示入口,用于提示用户此直播的概要。如下图:然而直播图片和容器的宽高比例出现不一致的情况。针对此情况,采取背景图contentmode展示为aspectFill且高斯模糊,上层高清图为aspectfit,给用户一种图片填满且

(2023 最新版)IntelliJ IDEA 下载安装及配置教程

IntelliJIDEA下载安装教程(图解)IntelliJIDEA简称IDEA,由JetBrains公司开发,是Java编程语言开发的集成环境,具有美观,高效等众多特点。在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(Git、SVN等)、JUnit、CVS整合、代码分析、创新的GUI设计等方面都有很好

Qt中表格属性相关操作,调整表格宽度高度自适应内容等

1表格列宽设置利用Qtdesigner设计,可以通过改变表头的列宽从而保证内容不会被遮盖,输入空格的方式增加表头的长度,比如表头为"Value",则改成"Value",可以扩展列默认的宽度,保证后面添加的数据不会遮盖了。2表头颜色在样式表中设置,双击编辑表头内容时,属性可设置字体颜色,但是无法设置背景色,QTableW

热文推荐