深入理解DockerFile
CMD 与 ENTRYPOINT 区别
- CMD 命令设置容器启动后默认执行的命令及其参数,但 CMD 设置的命令能够被 docker run 命令后面的命令行参数替换
- ENTRYPOINT 配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令)
- ENTRYPOINT 的 Exec 格式用于设置容器启动时要执行的命令及其参数,同时可通过 CMD 命令或者命令行参数提供额外的参数
- ENTRYPOINT 中的参数始终会被使用,这是与 CMD 命令不同的一点
1. Shell 格式和 Exec 格式命令
Shell 格式:指令 <command>
CMD java -jar test.jar
Exec 格式:指令 ["executable", "param1", "param2", ...]
ENTRYPOINT ["java", "-jar", "test.jar"]
2. Shell 格式和 Exec 格式命令的区别
- Shell 格式中的命令会直接被 Shell 解析
- Exec 格式不会直接解析,需要加参数
3. CMD 和 ENTRYPOINT 指令支持的命令格式
CMD 指令的命令支持以下三种格式:
- Exec 格式: CMD [“executable”,“param1”,“param2”]
- Exec 参数: CMD [“param1”,“param2”] 用来为 ENTRYPOINT 提供参数
- Shell 格式: CMD command param1 param2
ENTRYPOINT 指令的命令支持以下了两种格式:
- Exec 格式:可用使用 CMD 的参数和可使用
docker run [image] 参数
后面追加的参数 - Shell 格式 :不会使用 CMD 参数,可使用
docker run [image] 参数
后面追加的参数
4. 示例
ENTRYPOINT的Exec格式
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]
# 启动容器的命令: docker run -it [image]
# 输出: Hello
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello Test
ENTRYPOINT的Exec格式
+ CMD的Exec格式
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["Word"]
# 启动容器的命令: docker run -it [image]
# 输出: Hello Word
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello Test
ENTRYPOINT的Exec格式
+ CMD的shell格式
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]
CMD Word
# 启动容器的命令: docker run -it [image]
# 输出: Hello /bin/sh -c Word
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello Test
ENTRYPOINT的shell格式
FROM centos
ENTRYPOINT /bin/echo "Hello"
# 启动容器的命令: docker run -it [image]
# 输出: Hello
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello
ENTRYPOINT的shell格式
+ CMD的Shell格式
FROM centos
ENTRYPOINT /bin/echo "Hello"
CMD Word
# 启动容器的命令: docker run -it [image]
# 输出: Hello
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello
ENTRYPOINT的shell格式
+CMD的Exec格式
FROM centos
ENTRYPOINT /bin/echo "Hello"
CMD ["Word"]
# 启动容器的命令: docker run -it [image]
# 输出: Hello
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello