ONBUILD
ONBUILD指令在镜像中添加了一个触发指令,该指令将在以后执行,当镜像作为另一个镜像的基础镜像时。触发器将在下游构建的上下文中被执行,就好像在下游Dockerfile的FROM指令之后立即插入的一样。
任何构建指令都可以注册为触发器 。
如果我们正在构建一个镜像,该镜像将用作构建其他镜像的基础镜像,例如应用构建环境或通过特定用户配置进行自定义的守护进程,这很有用 。
例如,如果我们的镜像是可重复使用的Python应用程序构建器,需要在特定目录中添加应用源代码,之后可能需要调用一个构建脚本。我们现在不能只调用ADD和RUN,因为我们尚未访问应用程序源代码,并且每个应用程序构建的代码将有所不同。我们只需向应用程序开发人员提供一个Dockerfile样板文件,然后复制粘贴到他们的应用程序中。但这种做法低效、容易出错而且难以更新,因为它与应用程序特定的代码混在一起。
解决方案是使用ONBUILD注册指令,在下一个构建阶段时运行 。
工作原理如下:
当它遇到ONBUILD指令时,构建器会为正在构建的镜像的元数据添加一个触发器。该指令不会影响当前的构建 。
在构建结束时,所有触发器的列表存储在镜像列表中,在onBuild键下。它们可以通过docker inspect命令进行检查。
稍后,镜像可以作为正在使用FROM指令的一个新的构建(build)的基础镜像。作为FROM指令处理的一部分,下游构建器会查找ONBUILD触发器,并按注册的相同顺序执行它们。如果任何触发器出现故障,则FROM指令中止,从而导致构建的失败。如果所有触发器都成功,则FROM指令完成,构建过程将继续正常进行 。
执行后,触发器从最终的镜像中清除。换句话说,它们不被子构建继承。
例如,我们可以添加下面这样的内容:
Warning:
无法链式使用ONBUILD,例如ONBUILD ONBUILD。ONBUILD指令可能不会触发FROM或MAINTAINER指令。
Last updated