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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!