在 Dockerfile 中,ENTRYPOINTCMD 都用于指定容器启动时运行的命令,但它们在用途和行为上有关键区别


1. CMD

  • 作用:提供默认参数,可以被 docker run 时的命令行参数所覆盖。
  • 格式

    CMD ["executable", "param1", "param2"]   # 推荐的 JSON 数组格式
    CMD command param1 param2               # shell 格式,不推荐
  • 使用场景:当你希望容器有一个默认行为,但又允许用户在运行容器时替换这个行为时使用 CMD。

2. ENTRYPOINT

  • 作用:设置容器启动时始终执行的命令,通常用于定义一个“主进程”。
  • 格式

    ENTRYPOINT ["executable", "param1"]     # 推荐的 JSON 数组格式
    ENTRYPOINT command param1               # shell 格式
  • 使用场景:当你希望容器运行时总是执行特定程序(如脚本或二进制)时使用 ENTRYPOINT。

组合使用

  • ENTRYPOINT + CMD 可以配合使用:

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

    启动容器时,会执行:

    echo "Hello, World"

    如果你执行:

    docker run your_image Goodbye

    最终执行的命令将是:

    echo "Goodbye"
    CMD 被当作 ENTRYPOINT 的参数使用。

⚠️ 注意事项

  • 使用 ENTRYPOINT 时不容易被 docker run 覆盖,除非显式用 --entrypoint 参数。
  • 如果只设置了 CMD 而没有 ENTRYPOINT,则 CMD 会作为要执行的命令。

✅ 总结对比

项目CMDENTRYPOINT
定义作用默认命令或参数容器启动时始终执行的主命令
是否可覆盖可以被 docker run 覆盖不能被 docker run 覆盖(除非用 --entrypoint
推荐用法配合 ENTRYPOINT 传参数使用定义固定行为,如运行服务或脚本