dockerfile cmd vs entrypoint

在 Dockerfile 中,CMDENTRYPOINT 都用于定义容器启动时执行的命令,但它们的作用和使用场景有所不同。


1. CMD

  • 作用: 提供容器启动时的默认命令及其参数。

  • 特点:

    • 如果 Dockerfile 中有多个 CMD,只有最后一个生效。
    • 启动容器时,可以通过命令行参数覆盖 CMD 指定的命令。
    • 通常用于设置默认命令,允许用户在启动容器时灵活替换。
  • 示例:

    1
    CMD ["echo", "Hello, World!"]

    启动容器时,默认会输出 “Hello, World!”。如果用户指定了其他命令,如 docker run <image> echo "Hello, Docker!",则会覆盖 CMD,输出 “Hello, Docker!”。

869701b1d92ab34b1d542dce01a67c8d.png

2. ENTRYPOINT

  • 作用: 定义容器启动时执行的主命令,通常不会被覆盖。

  • 特点:

    • 如果 Dockerfile 中有多个 ENTRYPOINT,只有最后一个生效。
    • 启动容器时,命令行参数会作为 ENTRYPOINT 的参数追加,而不是覆盖。
    • 通常用于定义容器的主要执行逻辑,用户只能传递参数。
  • 示例:

    1
    ENTRYPOINT ["echo", "Hello"]

    启动容器时,默认会输出 “Hello”。如果用户指定了参数,如 docker run <image> World,则会输出 “Hello World”。

179f842fced7f230fa4bb8e70c063d0d.png

3. CMDENTRYPOINT 的组合使用

  • 作用: ENTRYPOINT 定义主命令,CMD 提供默认参数。

  • 特点:

    • 启动容器时,命令行参数会覆盖 CMD 的默认参数,但不会覆盖 ENTRYPOINT
    • 这种组合常用于定义可配置的容器。
  • 示例:

    1
    2
    ENTRYPOINT ["echo"]
    CMD ["Hello, World!"]

    启动容器时,默认会输出 “Hello, World!”。如果用户指定了参数,如 docker run <image> Hello, Docker!,则会输出 “Hello, Docker!”。

f15e7c6477688f36ccd9d3905c39baea.png

4. 总结

  • CMD: 提供默认命令,允许用户覆盖。
  • ENTRYPOINT: 定义主命令,用户只能传递参数(追加参数)。
  • 组合使用: ENTRYPOINT 定义主命令,CMD 提供默认参数,用户可覆盖 CMD 的参数。