当前位置: 首页 > news >正文

【docker】Dockerfile中ENTRYPOINT和CMD区别理解

1. ENTRYPOINTCMD 的作用

  • ENTRYPOINT: 设置容器启动时执行的主命令。它通常用来定义容器的主要行为或者应用的主进程,容器启动时会默认执行该命令。ENTRYPOINT 设置的命令不可被覆盖,但可以通过传递额外的参数来改变其行为。

  • CMD: 为 ENTRYPOINT 提供默认的参数。如果 CMDENTRYPOINT 都存在,并且 CMD 没有参数,CMD 会被作为默认参数传递给 ENTRYPOINT。如果容器运行时没有提供额外的命令或参数,CMD 会作为容器默认运行的命令。

2. 语法和例子

使用 ENTRYPOINT

ENTRYPOINT 可以有两种语法:

  • exec 形式(推荐使用)

    ENTRYPOINT ["executable", "param1", "param2"]
    

    这种方式会将命令和参数作为数组传递给容器,避免使用 shell 运行,确保信号正确传递。

  • shell 形式

    ENTRYPOINT command param1 param2
    

    这种方式会通过 shell 执行命令,类似于在终端中运行命令。

使用 CMD
  • CMD 作为命令

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

    这是给 ENTRYPOINT 提供默认参数,或者如果没有 ENTRYPOINT,则作为默认命令执行。

  • CMD 作为 shell 命令

    CMD ["param1", "param2"]
    
  • CMD 作为单独的命令(如果没有 ENTRYPOINT):

    CMD ["executable", "param1", "param2"]
    
综合使用 ENTRYPOINTCMD
  • 当同时使用 ENTRYPOINTCMD 时,CMD 会作为参数传递给 ENTRYPOINT。如果容器启动时没有其他命令行参数,CMD 中的默认参数会被使用。
# 示例 1:使用 ENTRYPOINT 和 CMD
FROM ubuntu:20.04

# 设置容器的默认命令
ENTRYPOINT ["python3", "app.py"]

# 设置默认参数
CMD ["--port", "8080"]

在这个例子中,当容器启动时,默认执行的是 python3 app.py --port 8080,如果在启动容器时提供了额外的参数(例如 docker run my_image --port 9090),那么 --port 9090 会替代 CMD 中的默认参数 --port 8080

3. ENTRYPOINTCMD 的区别

特性ENTRYPOINTCMD
功能定义容器启动时要执行的主命令或程序。提供默认的命令或参数(如果没有提供命令时)。
行为容器启动时,ENTRYPOINT 设置的命令始终执行。如果没有指定其他命令,CMD 会作为默认命令执行。
覆盖不容易被覆盖,除非使用 docker run 时明确指定命令。容器启动时,如果没有指定命令,CMD 会作为默认值。
语法ENTRYPOINT ["executable", "param1", "param2"]CMD ["param1", "param2"]
灵活性固定性更强,通常用于关键应用程序的启动。更灵活,可以被用户在 docker run 时覆盖。
结合使用CMD 可以提供默认参数给 ENTRYPOINTCMD 可以提供默认命令或者覆盖 ENTRYPOINT

4. 实际例子

例子 1:仅使用 ENTRYPOINT
FROM ubuntu:20.04

ENTRYPOINT ["echo", "Hello"]

运行这个容器时,默认会输出 Hello

例子 2:使用 ENTRYPOINTCMD
FROM ubuntu:20.04

ENTRYPOINT ["echo"]
CMD ["Hello World"]

如果不传递其他命令参数,运行容器时默认会输出 Hello World。但如果通过 docker run 传递其他参数(如 docker run my_image Goodbye),则会输出 Goodbye

总结:

  • ENTRYPOINT 适用于指定容器启动时始终执行的主命令或程序,适合核心应用程序。
  • CMD 用于提供默认参数或默认命令,具有更高的灵活性,可以通过运行时参数覆盖。

https://github.com/0voice

相关文章:

  • c语言strcat和strlen的注意事项
  • 实现分布式锁的方案与实战应用案例
  • PP-ChatOCRv3新升级:多页PDF信息抽取支持自定义提示词工程,拓展大语言模型功能边界
  • 【深度学习新浪潮】什么是推理模型?
  • spring boot中“编程式事务”与“声明式事务”对比
  • day18 学习笔记
  • leetcode146.LRU缓存
  • 全球消费理性化浪潮下:跨境电商品牌溢价体系面临重构
  • 深入解析异构计算:从原理到 C++ 实践
  • ubuntu22.04 如何安装 ch341 驱动
  • MySQL-触发器
  • QT基础:安装与简介
  • Unity插件SuperScrollView详解
  • 端到端语音识别案例
  • Docker部署sprintboot后端项目
  • Android 系统中,应用申请的权限相关信息介绍
  • 一文详解QT环境搭建:Windows使用CLion配置QT开发环境
  • 深度学习-153-DeepSeek之调用远程大模型API接口和可用的开源Deepseek服务
  • C#实现HTTP服务器:处理文件上传---解析MultipartFormDataContent
  • 26考研——线性表_ 线性表的链式表示_单链表(2)
  • 政府部门网站建设方案/网站品牌推广策略
  • 网站垃圾代码检查工具/经典软文
  • 成都搭建网站/学it学费大概多少钱
  • 榆林做网站的公司电话/软件网站排行榜
  • 问卷调查网站/58同城推广效果怎么样
  • 做购物网站数据库分析/免费b站推广网站详情