跳到主要内容

CMD与Entrypoint的区别

Docker 是一个用于自动部署、扩展和运行应用程序的开源平台。Dockerfile 是 Docker 配置文件,用于自定义镜像。Dockerfile 中有两个指令:CMD 和 ENTRYPOINT。它们都用于指定容器启动时的默认执行命令,但有一些区别:

  • CMD (Command): CMD 用于指定容器启动时的默认执行命令。如果在运行容器时没有提供任何命令,那么 Docker 将使用 CMD 指定的命令。CMD 可以有多个,但只有最后一个会生效。如果在运行时提供了命令行参数,那么 CMD 中指定的命令将会被覆盖。

CMD 的语法有两种:

CMD ["可执行文件", "参数1", "参数2", ...]:推荐使用这种格式,因为它更清晰且易于理解。
CMD 命令 参数1 参数2 ...:这种格式容易引起歧义,不推荐使用。
  • ENTRYPOINT (入口点): ENTRYPOINT 用于指定容器启动时的执行命令,并且该命令不会被容器启动时的命令行参数覆盖。ENTRYPOINT 的主要作用是将容器视为一个可执行的程序,即使在运行时提供了参数,ENTRYPOINT 指定的命令也会被执行,而提供的参数将作为 ENTRYPOINT 指定命令的参数。

ENTRYPOINT 的语法也有两种:

ENTRYPOINT ["可执行文件", "参数1", "参数2", ...]:推荐使用这种格式,因为它更清晰且易于理解。
ENTRYPOINT 命令 参数1 参数2 ...:这种格式容易引起歧义,不推荐使用。

CMD 和 ENTRYPOINT 的主要区别在于它们的行为和用途:

  • CMD 用于指定容器启动时的默认执行命令,如果在运行容器时提供了命令行参数,CMD 中的命令将被覆盖。
  • ENTRYPOINT 用于指定容器启动时的固定执行命令,该命令不会被覆盖,运行时提供的参数将作为 ENTRYPOINT 指定命令的参数。
  • 在实际使用中,可以根据具体需求选择 CMD 或 ENTRYPOINT。如果想要创建一个具有默认行为的镜像,同时允许用户覆盖默认行为,可以使用 CMD。如果想要创建一个始终执行特定命令的镜像,并允许用户传递参数,可以使用 ENTRYPOINT。同时,CMD 和 ENTRYPOINT 也可以一起使用,此时 CMD 中指定的参数将作为 ENTRYPOINT 指定命令的默认参数。