Docker ONBUILD 指令

示例

ONBUILD [INSTRUCTION]

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

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

如果您要构建的映像将用作构建其他映像的基础,例如,可以使用用户特定的配置自定义的应用程序构建环境或守护程序,则此功能很有用。

例如,如果您的图像是可重用的Python应用程序构建器,则将需要在特定目录中添加应用程序源代码,并且此后可能需要调用构建脚本。你不能只是打电话ADD和RUN现在,因为你还没有访问应用程序的源代码,这将是为每个应用程序生成不同的。您可以简单地为应用程序开发人员提供一个样板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指令可能不会触发FROM或MAINTAINER指令。