Dockerfile中CMD和ENTRYPOINT指令
说明:
1. 本文基于Docker Engine - Community 20.10.22版本讲解
概述
Dockerfile中CMD指令与ENTRYPOINT指令都可以指定容器的入口命令, 但具体有什么区别呢?下面展开说说
CMD指令
指定启动容器时默认执行的命令, 支持3种模式:
1、 exec模式:如 CMD ["ping","www.baidu.com"] , 推荐方式
2、 shell模式:如 CMD ping www.baidu.com
3、 参数模式:如 CMD ["-c","1"] ,配合ENTRYPOINT指令使用
对于exec、shell模式,指定容器启动参数会覆盖掉整个CMD指令,而不是作为参数执行。假设Dockerfile内容如下
FROM centos:7
# 省略其余无关指令
CMD ["ping","www.baidu.com"]
运行docker run -it --rm [tag] -c 1 将报错, 因为在bash中无法直接运行-c 1
运行 docker run -it --rm [tag] ping www.baidu.com -c 1则正常
ENTRYPOINT指令
指定镜像的默认入口命令,启动容器时传入的参数将作为该指令的参数执行,支持2种模式:
1、exec模式: 如ENTRYPOINT["ping","www.baidu.com"] , 推荐方式
2、shell模式: 如ENTRYPOINT ping www.baidu.com
以上两种模式,指定容器启动参数会作为ENTRYPOINT指令的参数执行。假设Dockerfile内容如下
FROM centos:7
# 省略其余无关指令
ENTRYPOINT ["ping","www.baidu.com"]
运行docker run -it --rm [tag] -c 1 ,容器将在启动时执行 ping www.baidu.com -c 1 。
通过 --entrypoint 参数可以覆盖掉Dockerfile中ENTRYPOINT指定的命令, 如 docker run -it --rm --entrypoint ls [tag] -l /usr则容器启动时会执行ls -l /usr命令
CMD与ENTRYPOINT指令混合使用
混合使用时,通常将CMD指定的值作为ENTRYPOINT指令的参数使用。假设Dockerfile内容如下
FROM centos:7
# 省略其余无关指令
CMD ["-c","1"]
ENTRYPOINT ["ping","www.baidu.com"]
运行docker run -it --rm [tag] ,容器将在启动时执行 ping www.baidu.com -c 1
指定容器启动参数,将会覆盖掉CMD指令的值, 如运行docker run -it --rm [tag] -c 5 ,容器将在启动时执行 ping www.baidu.com -c 5 , 当然也通过--entrypoint覆盖掉Dockerfile中ENTRYPOINT指定的命令
混合使用时注意:
1、当ENTRYPOINT使用bash模式时, CMD指令与容器启动时指定的所有参数将会被忽略, 这种方式不推荐使用
2、当ENTRYPOINT使用exec模式时, CMD 只支持参数模式,推荐方式
本文来自博客园,作者:林一gg,转载请注明原文链接:https://www.cnblogs.com/linyigg/p/17736550.html

浙公网安备 33010602011771号