在Docker中,docker run
、CMD
和 ENTRYPOINT
是相互关联又各有不同的概念,它们都涉及到如何配置和启动容器。下面详细介绍它们的区别和联系:
- docker run
docker run
是 Docker 客户端命令,用于创建一个新的容器并运行其中的应用程序。当你执行docker run
时,你可以指定一系列参数,如镜像名称、命令、环境变量、端口映射、卷挂载等。它接受的命令行参数可以用来覆盖或者附加到镜像构建阶段定义的CMD
或ENTRYPOINT
指令。
- CMD
- 在 Dockerfile 中,
CMD
指令用于定义容器启动时默认执行的命令及其参数。它可以有三种格式:
CMD ["executable", "param1", "param2"]
:JSON数组格式,推荐使用,exec形式执行程序,不会经过shell解析。CMD ["param1", "param2"]
:如果指定了ENTRYPOINT
,那么CMD
中的参数将作为ENTRYPOINT
的参数传递。CMD command param1 param2
:shell格式,会通过shell执行命令。
- 如果用户在
docker run
命令后面指定了命令,则CMD
中定义的默认命令会被新指定的命令替换。若没有指定命令,则执行CMD
中指定的命令。
- ENTRYPOINT
ENTRYPOINT
也是在 Dockerfile 中定义的,它用于指定容器启动时始终执行的命令,这个命令不那么容易被docker run
的命令行参数覆盖,除非以组合的形式追加参数。ENTRYPOINT
也有两种格式,与CMD
相似:
ENTRYPOINT ["executable", "param1"]
:exec形式,优先级高于CMD
,并且无论是否提供docker run
后的命令,都会执行此命令,并将docker run
后的参数追加到ENTRYPOINT
后。ENTRYPOINT command param1
:shell格式。
- 使用
ENTRYPOINT
可以确保每次容器启动时都执行同一命令,这有助于将容器设计得更加“应用导向”,使得容器的行为更一致。当同时设置了CMD
和ENTRYPOINT
时,CMD
的内容会被视为ENTRYPOINT
的参数。
总结起来:
CMD
是容器启动时如果没有指定命令时的默认行为,它的灵活性较高,易于被docker run
后的命令覆盖。ENTRYPOINT
更像是容器的核心功能定义,常用于定义容器的主应用程序,并且能接收docker run
的参数,这样可以确保容器启动时总是执行预期的程序,并且可以处理任何额外的参数。
综上所述,两者可以配合使用,共同决定容器启动时的具体行为,从而更好地控制容器的应用场景和定制程度。