在Docker中,docker run
、cmd
和entrypoint
是相互关联又各有不同的概念,它们都涉及到如何配置和启动容器
1、docker run
docker run
是Docker客户端命令,用于创建一个新的容器并运行其中的应用程序。当你执行docker run
时,你可以指定一系列参数,如镜像名称、命令、环境变量、端口映射、卷挂载等。它接受的命令行参数可以用来覆盖或者附加到镜像构建阶段定义的CMD
或ENTRYPOINT
指令
2、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
中指定的命令
3、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
的命令作为参数,这样可以确保容器启动时总是执行预期的程序