CMD与Entrypoint的区别
Docker 是一个用于自动部署、扩展和运行应用程序的开源平台。Dockerfile 是 Docker 配置文件,用于自定义镜像。Dockerfile 中有两个指令:CMD 和 ENTRYPOINT。它们都用于指定容器启动时的默认执行命令,但有一些区别:
- CMD (Command): CMD 用于指定容器启动时的默认执行命令。如果在运行容器时没有提供任何命令,那么 Docker 将使用 CMD 指定的命令。CMD 可以有多个,但只有最后一个会生效。如果在运行时提供了命令行参数,那么 CMD 中指定的命令将会被覆盖。
CMD 的语法有两种:
CMD ["可执行文件", "参数1", "参数2", ...]:exec 格式(JSON 数组),推荐使用。
CMD 命令 参数1 参数2 ...:shell 格式,实际会通过 /bin/sh -c 来执行,此时命令进程不是容器的 1 号进程,可能收不到 docker stop 发来的停止信号。
- ENTRYPOINT (入口点):
ENTRYPOINT 用于指定容器启动时的执行命令,并且该命令不会被容器启动时的命令行参数覆盖(除非显式使用
docker run --entrypoint来替换它)。ENTRYPOINT 的主要作用是将容器视为一个可执行的程序,即使在运行时提供了参数,ENTRYPOINT 指定的命令也会被执行,而提供的参数将作为 ENTRYPOINT 指定命令的参数。
ENTRYPOINT 的语法也有两种:
ENTRYPOINT ["可执行文件", "参数1", "参数2", ...]:exec 格式(JSON 数组),推荐使用。
ENTRYPOINT 命令 参数1 参数2 ...:shell 格式,通过 /bin/sh -c 来执行,并且会忽略 CMD 以及 docker run 传入的命令行参数。
CMD 和 ENTRYPOINT 的主要区别在于它们的行为和用途:
- CMD 用于指定容器启动时的默认执行命令,如果在运行容器时提供了命令行参数,CMD 中的命令将被覆盖。
- ENTRYPOINT 用于指定容器启动时的固定执行命令,该命令不会被 docker run 的命令行参数覆盖(只能用
--entrypoint显式替换),运行时提供的参数将作为 ENTRYPOINT 指定命令的参数。 - 在实际使用中,可以根据具体需求选择 CMD 或 ENTRYPOINT。如果想要创建一个具有默认行为的镜像,同时允许用户覆盖默认行为,可以使用 CMD。如果想要创建一个始终执行特定命令的镜像,并允许用户传递参数,可以使用 ENTRYPOINT。同时,CMD 和 ENTRYPOINT 也可以一起使用,此时 CMD 中指定的参数将作为 ENTRYPOINT 指定命令的默认参数——注意这种组合要求两者都写成 exec 格式(JSON 数组)才能按预期工作。