ONBULID

ONBUILD [INSTRUCTION]

ONBUILD指令给镜像添加触发器在以后会被执行,当这个镜像被其他镜像作为基础镜像。触发器会被在下游构建的上下文中执行,就好像他们直接被插入到了下游Dockerfile中的FROM指令后。

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

这是非常有用的,如果你构建一个镜像来作为其他镜像的基础镜像,例如一个应用的构建环境或守护程序可能和用户特定的配置有关。

例如,你的镜像是一个可以重复使用的Python应用生成器,这需要将应用的源码添加到特定的目录当中,然后可能会需要一个脚本在完成添加源码之后。你现在不能使用ADDRUN指令,因为你现在没有接触到应用的源码,并且每个应用的构建都有可能不同。你可以直接提供给应用的开发者一个样板Dockerfile去复制粘贴他们的应用,但是这是低效的、容易出错的并且不容易去更新的,因为其中混合了应用的源码。

解决的方法就是使用ONBULID去注册下一个阶段要运行的指令。

下面是他如何工作的:

  1. 当遇到ONBULID指令时,构建器会添加一个触发器到被构建的镜像的元数据当中。这个指令不会影响本次构建。
  2. 在构建的结尾,所有的触发器都会被存储到镜像的描述文件当中,在关键字OnBuild下面。你可以通过docker inspect命令来观察他们。
  3. 一会这个镜像可能通过FROM指令被当做构建的基础镜像。作为处理FROM命令的一部分,下游构建器会寻找ONBUILD触发器,并且会执行他们所注册的命令。如果任何的触发器失败了,那么FROM指令会因为构建失败而中断。如果所有的触发器都成功了,那么FROM指令完成了,并且会像平常一样继续构建。
  4. 在最后的镜像被执行以后触发器会被清理。换句话来说就是不会存在“grand-children”构建。

例如你可能添加一些东西像下面一样:

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

警告:链式的ONBUILD指令是不支持的,使用ONBUILD ONBUILD是不允许的。

警告ONBUILD指令可能不会触发FROM或者MAINTAINER 指令。

results matching ""

    No results matching ""