ONBULID
ONBUILD [INSTRUCTION]
ONBUILD
指令给镜像添加触发器在以后会被执行,当这个镜像被其他镜像作为基础镜像。触发器会被在下游构建的上下文中执行,就好像他们直接被插入到了下游Dockerfile
中的FROM
指令后。
任何的构建指令都可以被注册为一个触发器。
这是非常有用的,如果你构建一个镜像来作为其他镜像的基础镜像,例如一个应用的构建环境或守护程序可能和用户特定的配置有关。
例如,你的镜像是一个可以重复使用的Python应用生成器,这需要将应用的源码添加到特定的目录当中,然后可能会需要一个脚本在完成添加源码之后。你现在不能使用ADD
和RUN
指令,因为你现在没有接触到应用的源码,并且每个应用的构建都有可能不同。你可以直接提供给应用的开发者一个样板Dockerfile
去复制粘贴他们的应用,但是这是低效的、容易出错的并且不容易去更新的,因为其中混合了应用的源码。
解决的方法就是使用ONBULID
去注册下一个阶段要运行的指令。
下面是他如何工作的:
- 当遇到
ONBULID
指令时,构建器会添加一个触发器到被构建的镜像的元数据当中。这个指令不会影响本次构建。 - 在构建的结尾,所有的触发器都会被存储到镜像的描述文件当中,在关键字
OnBuild
下面。你可以通过docker inspect
命令来观察他们。 - 一会这个镜像可能通过
FROM
指令被当做构建的基础镜像。作为处理FROM
命令的一部分,下游构建器会寻找ONBUILD
触发器,并且会执行他们所注册的命令。如果任何的触发器失败了,那么FROM
指令会因为构建失败而中断。如果所有的触发器都成功了,那么FROM
指令完成了,并且会像平常一样继续构建。 - 在最后的镜像被执行以后触发器会被清理。换句话来说就是不会存在“grand-children”构建。
例如你可能添加一些东西像下面一样:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
警告:链式的
ONBUILD
指令是不支持的,使用ONBUILD ONBUILD
是不允许的。警告:
ONBUILD
指令可能不会触发FROM
或者MAINTAINER
指令。