ONBUILD 指令

ONBUILD [INSTRUCTION]

当图像用作另一个构建的基础时,ONBUILD 指令向图像添加将在稍后执行的触发指令。触发器将在下游构建的上下文中执行,就好像它已经在下游 Dockerfile 中的 FROM 指令之后立即插入一样。

任何构建指令都可以注册为触发器。

如果要构建将用作构建其他映像的基础的映像(例如,可以使用特定于用户的配置自定义的应用程序构建环境或守护程序),这将非常有用。

例如,如果你的映像是可重用的 Python 应用程序构建器,则需要将应用程序源代码添加到特定目录中,并且可能需要在此之后调用构建脚本。你现在不能只调用 ADDRUN,因为你还无法访问应用程序源代码,并且每个应用程序构建都会有所不同。你可以简单地为应用程序开发人员提供一个样板 Dockerfile 来复制粘贴到他们的应用程序中,但这样做效率低,容易出错且难以更新,因为它与特定于应用程序的代码混合在一起。

解决方案是使用 ONBUILD 注册预先指令,以便在下一个构建阶段运行。

以下是它的工作原理:

当遇到 ONBUILD 指令时,构建器会为正在构建的图像的元数据添加触发器。该指令不会影响当前构建。

在构建结束时,所有触发器的列表都存储在映像清单中的 OnBuild 键下。可以使用 docker inspect 命令检查它们。稍后,可以使用 FROM 指令将图像用作新构建的基础。作为处理 FROM 指令的一部分,下游构建器查找 ONBUILD 触发器,并按照它们注册的顺序执行它们。如果任何触发器失败,则中止 FROM 指令,这反过来导致构建失败。如果所有触发器都成功,则 FROM 指令完成,并且构建继续照常进行。

执行后,触发器将从最终图像中清除。换句话说,它们不是由大孩子构建继承的。

例如,你可以添加以下内容:

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

警告:不允许使用 ONBUILD ONBUILD 链接 ONBUILD 指令。

警告:ONBUILD 指令可能不会触发 FROMMAINTAINER 指令。