Docker基础教程(110)Dockerfile指令之设置二次构建命令的ONBUILD命令:ONBUILD:Docker镜像中的“时间胶囊“,子镜像构建时自动触发!

ONBUILD指令可以为镜像添加触发器(触发器也可以称之为模板Dockfile),其参数是任意一个Dockerfile指令。它能够让父镜像中定义的指令不被立即执行,而是在子镜像构建时自动触发执行,从而实现构建指令的"延迟满足"。


01 ONBUILD是什么?Docker的延迟执行魔法

ONBUILD是Dockerfile中的一个特殊指令,格式为ONBUILD <其它指令>5。它与普通的Dockerfile指令不同,不会在当前镜像构建过程中执行,而是作为一个触发器(trigger),在被当前镜像作为基础镜像的子镜像构建时才会执行。

这种机制使得ONBUILD非常适合创建模板镜像或基础镜像,这些镜像预定义了一些构建步骤,但需要等到实际项目构建时才能确定具体操作。

例如,一个Node.js基础镜像可以使用ONBUILD指令,规定在子镜像构建时自动复制package.json文件并执行npm install安装依赖。

02 ONBUILD工作原理:构建过程的时空穿梭

要理解ONBUILD的工作原理,可以将其看作是一种构建指令的时空转移——指令写在父镜像中,但执行却发生在子镜像的构建过程中。

当你在Dockerfile中使用ONBUILD指令时,Docker会记录这些指令,但不会在当前构建过程中执行它们。构建出的镜像将包含这些预定的操作指令。

当另一个Dockerfile以此镜像作为基础镜像(使用FROM指令)时,Docker会在执行新Dockerfile的指令之前,先执行基础镜像中通过ONBUILD预定义的所有指令。

值得注意的是:ONBUILD指令只能在直接子镜像构建中执行,对孙子镜像构建无效。也就是说,如果你基于包含ONBUILD的镜像A构建镜像B,ONBUILD指令会执行;但如果你再基于镜像B构建镜像C,ONBUILD指令就不会再次执行了。

03 为什么需要ONBUILD?解决镜像模板化问题

在没有ONBUILD指令的情况下,创建相似镜像的过程往往需要大量重复的Dockerfile内容。

假设你有多个Node.js项目,每个项目都需要类似的Docker构建过程:创建/app目录、复制package.json、运行npm install、复制源代码、设置启动命令等。

如果每个项目都复制相同的Dockerfile,当需要修改这个构建过程时(例如需要添加一些参数),你就必须逐个更新每个项目的Dockerfile,极其繁琐且容易出错。

使用ONBUILD指令,你可以创建一个智能基础镜像,其中包含了所有通用的构建指令(但被标记为ONBUILD)。各个

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值