> For the complete documentation index, see [llms.txt](https://camelgemonion.gitbook.io/docker/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://camelgemonion.gitbook.io/docker/dockerfile-zhi-ling/onbuild.md).

# ONBUILD

```
ONBUILD <INSTRUCTION>
```

**ONBUILD指令**在镜像中添加了一个触发指令，该指令将在以后执行，当镜像作为另一个镜像的基础镜像时。触发器将在下游构建的上下文中被执行，就好像在下游**Dockerfile**的**FROM指令**之后立即插入的一样。

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

如果我们正在构建一个镜像，该镜像将用作构建其他镜像的基础镜像，例如应用构建环境或通过特定用户配置进行自定义的守护进程，这很有用 。

例如，如果我们的镜像是可重复使用的**Python**应用程序构建器，需要在特定目录中添加应用源代码，之后可能需要调用一个构建脚本。我们现在不能只调用**ADD**和**RUN**，因为我们尚未访问应用程序源代码，并且每个应用程序构建的代码将有所不同。我们只需向应用程序开发人员提供一个**Dockerfile**样板文件，然后复制粘贴到他们的应用程序中。但这种做法低效、容易出错而且难以更新，因为它与应用程序特定的代码混在一起。

解决方案是使用**ONBUILD**注册指令，在下一个构建阶段时运行 。

工作原理如下：

1. 当它遇到**ONBUILD指令**时，构建器会为正在构建的镜像的元数据添加一个触发器。该指令不会影响当前的构建 。
2. 在构建结束时，所有触发器的列表存储在镜像列表中，在**onBuild**键下。它们可以通过**docker inspect**命令进行检查。
3. 稍后，镜像可以作为正在使用**FROM指令**的一个新的构&#x5EFA;**（build）**&#x7684;基础镜像。作为**FROM指令**处理的一部分，下游构建器会查找**ONBUILD触发器**，并按注册的相同顺序执行它们。如果任何触发器出现故障，则**FROM指令**中止，从而导致构建的失败。如果所有触发器都成功，则**FROM指令**完成，构建过程将继续正常进行 。
4. 执行后，触发器从最终的镜像中清除。换句话说，它们不被子构建继承。

例如，我们可以添加下面这样的内容：

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

**Warning：**

无法链式使用**ONBUILD**，例如**ONBUILD ONBUILD**。**ONBUILD指令**可能不会触发**FROM**或**MAINTAINER指令**。
