在Docker中,docker run cmd entrypoint 有什么区别?
在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的参数,这样可以确保容器启动时总是执行预期的程序,并且可以处理任何额外的参数。
综上所述,两者可以配合使用,共同决定容器启动时的具体行为,从而更好地控制容器的应用场景和定制程度。

浙公网安备 33010602011771号