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 只支持参数模式,推荐方式

posted @   林一gg  阅读(599)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示