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)。各个

最低0.47元/天 解锁文章
599

被折叠的 条评论
为什么被折叠?



