在运维工作中,dockerfile中CMD指令与ENTRYPOINT有何区别?

news/2025/2/21 11:03:06/文章来源:https://www.cnblogs.com/huangjiabobk/p/18724887

在 Dockerfile 中,CMDENTRYPOINT 是两个用于定义容器启动时默认执行命令的指令,但它们在功能和使用场景上有明显的区别。以下是它们的详细对比:

1. 基本定义
  • 1.1 CMD
    • 用于为容器指定默认的启动命令。
    • 如果用户在运行容器时没有指定其他命令,CMD 指定的命令会被执行。
    • 它是可被覆盖的,即用户可以通过在 docker run 命令中指定新的命令来覆盖 CMD 中定义的命令。
  • 1.2 ENTRYPOINT
    • 用于定义容器启动时执行的程序或脚本。
    • 它是不可被覆盖的,即用户不能通过在 docker run 命令中指定新的命令来覆盖 ENTRYPOINT 中定义的命令。
    • 如果同时使用了 ENTRYPOINTCMDCMD 的内容会被作为参数传递给 ENTRYPOINT
2. 使用场景
  • 2.1 CMD 的使用场景

    • 当你希望容器启动时运行一个默认的命令,但用户可以根据需要覆盖该命令时,使用 CMD

    • 例如,你希望容器默认运行一个 Web 服务器,但用户也可以选择运行一个脚本或命令行工具。

    • 示例:

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

      用户可以通过以下命令覆盖默认行为:

      docker run my-image bash
      
  • 2.2 ENTRYPOINT 的使用场景

    • 当你希望容器始终运行一个固定的程序或脚本,并且用户可以通过传递参数来扩展功能时,使用 ENTRYPOINT

    • 例如,你希望容器始终运行一个脚本,用户可以通过传递参数来控制脚本的行为。

    • 示例:

      ENTRYPOINT ["./my-script.sh"]
      CMD ["--default-param"]
      

      用户可以通过以下命令传递参数:

      docker run my-image --custom-param
      

      这时,--custom-param 会被传递给 ./my-script.sh

3. 参数传递
  • 3.1 CMD
    • 如果用户在 docker run 中指定了新的命令,则 CMD 的内容会被完全替换。
    • 如果没有指定新的命令,则 CMD 的内容会被执行。
  • 3.2 ENTRYPOINT
    • ENTRYPOINT 定义的命令始终会被执行。
    • 如果同时定义了 CMDCMD 的内容会被作为参数传递给 ENTRYPOINT
    • 用户可以通过在 docker run 中指定参数来覆盖 CMD 的内容。
4. 命令格式
  • 4.1 CMD
    • 可以有三种格式:
      1. Shell 形式CMD command param1 param2
        例如:CMD python app.py
      2. Exec 形式CMD ["command", "param1", "param2"]
        例如:CMD ["python", "app.py"]
      3. 默认参数形式CMD ["param1", "param2"]
        仅当与 ENTRYPOINT 一起使用时有效。
  • 4.2 ENTRYPOINT
    • 只有两种格式:
      1. Shell 形式ENTRYPOINT command param1 param2
        例如:ENTRYPOINT ./my-script.sh
      2. Exec 形式ENTRYPOINT ["command", "param1", "param2"]
        例如:ENTRYPOINT ["./my-script.sh"]
5. 示例对比
5.1 使用 CMD
CMD ["python", "app.py"]
  • 默认行为:容器启动时运行 python app.py
  • 用户覆盖:docker run my-image bash,容器会运行 bash 而非 python app.py
5.2 使用 ENTRYPOINT
ENTRYPOINT ["./my-script.sh"]
CMD ["--default-param"]
  • 默认行为:容器启动时运行 ./my-script.sh --default-param
  • 用户覆盖:docker run my-image --custom-param,容器会运行 ./my-script.sh --custom-param
6. 总结
  • 6.1 CMD
    • 更灵活,用户可以覆盖默认命令。
    • 适合定义默认行为,但允许用户自定义。
  • 6.2 ENTRYPOINT
    • 更固定,用户不能覆盖,但可以通过参数扩展功能。
    • 适合定义容器的固定入口程序或脚本。

在实际使用中,可以根据你的需求选择合适的指令。如果需要用户能够灵活控制容器的行为,优先使用 CMD;如果需要容器始终运行某个程序或脚本,优先使用 ENTRYPOINT

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 element-ui table表格内容上下垂直居中的解决方法

没处理的时候是不是看着很丑只需要在需要处理的 el-table-column 标签中添加 className 然后设置样式为 vertical-align: top; 完整代码 : 然后增加对应的样式<style>.el-table .my-store-management-cell {vertical-align: top;} </style>然后就可以了

老年人19

老年人项目大概情况效果展示

Vulnhub-kioptix2014靶机getshell及提权

靶机搭建 点击扫描虚拟机然后扫描文件夹即可信息收集 扫描ip nmap扫描得到目标靶机ip nmap -sn 192.168.108.0/24故 攻击机:192.168.108.130 目标靶机:192.168.108.140扫端口和服务信息 扫描开放端口信息 nmap -p 1-65535 192.168.108.140可用信息 22/tcp closed ssh …

自然资源数据促进数字化治理能力提升

在数字化时代,自然资源数据作为国家治理体系和治理能力现代化的重要支撑,其开发利用对于推动经济社会高质量发展具有重要意义。本文将从测绘地理信息与遥感专业的角度,探讨如何推动自然资源数据要素的开发利用,以促进数字化治理能力的提升。 一、自然资源数据要素的重要性自…

老年人11

编写日常评估表的servlet层代码

git学习 -2025/2/17

git 基础操作指令 git add / git commit -m "注释" /git statusgit log[option]参数版本回退添加文件至忽略列表分支操作远程仓库 添加远程仓库 git remote add <远端名称> <仓库路径> 查看远程仓库 git remote 推送到远程仓库 命令:git push [-f] [--s…

老年人5

编写老年人信息登记表的service层的代码

ASP.NET Core 6 基础入门系列(15) 项目在IIS下部署的两种进程托管模型

系列目录 【已更新最新开发文章,点击查看详细】  ASP.NET Core 6 基础入门系列(14) 项目发布与IIS部署 ASP.NET Core 6 基础入门系列(13) Web 服务器介绍 ASP.NET Core 6 基础入门系列(12) 项目的多种启动方式及问题 ASP.NET Core 6 基础入门系列(11) 项目结构详解之项目…

ASP.NET Core 6 基础入门系列(14) 项目发布与IIS部署

系列目录 【已更新最新开发文章,点击查看详细】ASP.NET Core 6 基础入门系列(13) Web 服务器介绍 ASP.NET Core 6 基础入门系列(12) 项目的多种启动方式及问题 ASP.NET Core 6 基础入门系列(11) 项目结构详解之项目入口Program.cs ASP.NET Core 6 基础入门系列(10) 项目结…

ASP.NET Core 6 基础入门系列(1) ASP.NET Core 6.0 简介

系列目录 【已更新最新开发文章,点击查看详细】预备知识1: C#5、C#6、C#7、C#8、C#9、C#10 预备知识2: .NET 对比 .NET Framework 预备知识3: ASP.NET Core 概述 预备知识4: ASP.NET Core 与 ASP.NET 宏观对比 预备知识5: ASP.NET 请求处理机制 预备知识6: AS…

老年人1

用servlet构建一个javaweb项目并配置好环境

数据类型拓展

数据类型扩展 整数拓展 整数拓展:进制 二进制0b开头 十进制 八进制0开头 十六进制0x开头public class Demo03 {public static void main(String[] args) {//整数拓展: 进制 二进制0b开头 十进制 八进制0开头 十六进制0x开头int i =10;int i2 =010…