作者信息:https://home.cnblogs.com/u/huangjiabobk

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

在 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

posted @   黄嘉波  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
历史上的今天:
2024-02-19 在k8S中,状态码监控是怎么做的?
2024-02-19 在k8S中,blackbox主要是监控什么的?
2024-02-19 在k8S中,etcd是怎么监控的?
2024-02-19 在k8S中,日志索引的作用是什么?
2024-02-19 在k8S中,Fluentd的工作原理是什么?
版权声明:原创作品,谢绝转载!否则将追究法律责任。--作者 黄嘉波
点击右上角即可分享
微信分享提示