Author:赵志乾
Date:2024-08-01
Declaration:All Right Reserved!!!
1. 简介
CMD和ENTRYPOINT都是Dockerfile中用于定义容器启动时执行命令的两个重要指令,两者在原理、用法以及相互关系上有显著的区别;
CMD:在Dockerfile中用于为容器提供默认的执行命令或参数,当容器启动时,若没有通过docker run命令指定其他命令,则会执行CMD中定义的命令;即CMD的主要用途是为容器内的应用程序提供默认的运行方式或参数;
ENTRYPOINT:在Dockerfile中用于指定容器启动时运行的命令,该命令在容器每次启动都会执行,并且不会被docker run中指定的其他命令覆盖(但可以通过--entrypoint选项覆盖);即ENTRYPOINT通常用于设置容器的主进程或服务,例如启动一个Web服务器或数据库服务器;
2. 基本语法
CMD有三种语法格式:
- exec模式,例如 CMD["executable","param1","param2"],这是推荐的格式,拥有更好的性能和安全性;
- shell模式,例如 CMD command param1 param2 ;
- 传递参数,例如 CMD ["param1","param2"],这种格式下,CMD提供的参数会作为默认参数传递给ENTRYPOINT;
ENTRYPOINT有两种语法格式:
- exec模式,例如:ENTRYPOINT ["executable","param1","param2"];
- shell模式,例如:ENTRYPOINT command param1 param2;
3. 区别与联系
- 覆盖机制:CMD提供的默认指令或参数可以被docker run命令中指定的命令或参数覆盖;而ENTRYPOINT指定的命令不会被覆盖,但可以通过docker run命令传递参数给ENTRYPOINT指定的命令;
- 用途:CMD主要用于为容器内的应用程序提供默认的运行方式或参数;ENTRYPOINT则用于定义容器的主进程或服务,确保容器始终按照预期的方式运行;
- 配合使用:CMD和ENTRYPOINT可以配合使用,以提供更灵活的容器行为;当同时设置CMD和ENTRYPOINT时,CMD会被视为ENTRYPOINT的参数;
4. 注意事项
- 每个Dockerfile中只能有一条CMD指令,若指定了多条,只有最后一条会被执行;
- 每个Dockerfile中只能有一条ENTRYPOINT指令,若指定了多条,只有最后一个生效;
- 结合使用CMD和ENTRYPOINT的方式主要用于需要固定容器入口点,但又想提供默认参数或允许用户覆盖参数的场景;
5. 结合CMD与ENTRYPOINT
ENTRYPOINT ["echo", "Message from ENTRYPOINT:"]
CMD ["Hello,"]
若运行容器时,不提供任何参数( docker run <image_name>),容器将输出 Message from ENTRYPOIN:Hello,;若运行容器时提供了新的参数(docker run <image_name> Docker),容器将输出Message from ENTRYPOINT:Docker;