onbuild 是 dockerfile 中定义延迟执行指令的机制,仅在子镜像构建时(from 当前镜像后)触发执行,且仅限一级继承;它不参与自身镜像构建,适用于标准化基础镜像的通用初始化操作。
onbuild 是 dockerfile 中用于定义“延迟执行指令”的机制,它本身不参与当前镜像的构建过程,只在该镜像被用作其他镜像的基础(即子镜像的 from)时才触发执行。
ONBUILD 的基本作用原理
当一个镜像 A 通过 Dockerfile 中的 ONBUILD RUN/COPY/ADD/... 设置了触发器,那么: - 构建 A 镜像时,这些 ONBUILD 指令完全不运行; - 后续有人写新 Dockerfile,以 FROM A 开头构建镜像 B 时,Docker 会自动把 A 中所有 ONBUILD 指令,插在 B 的 Dockerfile 的 FROM A 行之后、其余指令之前执行; - 这些触发指令在 B 的构建上下文中运行(比如路径、环境变量、工作目录都以 B 的构建为准); - ONBUILD 触发仅限一级继承——B 镜像中定义的 ONBUILD 不会在以 B 为 FROM 的 C 镜像中触发。
怎么写一个带 ONBUILD 的父镜像
例如,构建一个通用 Python 应用基础镜像,希望所有子镜像自动安装依赖并复制源码:
- 编写父 Dockerfile(如 Dockerfile.base):
FROM python:3.11-slim
ONBUILD COPY requirements.txt /app/
ONBUILD RUN pip install --no-cache-dir -r /app/requirements.txt
ONBUILD COPY . /app/
ONBUILD WORKDIR /app
ONBUILD CMD ["python", "app.py"]
- 构建父镜像:docker build -f Dockerfile.base -t my-python-base .
- 此时启动容器 docker run -it my-python-base,不会看到 requirements.txt 被复制,也不会执行 pip install —— 因为 ONBUILD 还没被触发。
子镜像如何继承并触发 ONBUILD
子镜像只需以父镜像为 FROM,并正常编写自己的指令,构建时就会自动触发:
- 子 Dockerfile(Dockerfile.app)示例:
FROM my-python-base
EXPOSE 8000
USER nobody
- 确保当前目录有 requirements.txt 和 app.py;
- 执行构建:docker build -f Dockerfile.app -t my-web-app .
- Docker 实际执行顺序等效于:
FROM my-python-base
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r /app/requirements.txt
COPY . /app/
WORKDIR /app
CMD ["python", "app.py"]
EXPOSE 8000
USER nobody
使用 ONBUILD 的注意事项
- ONBUILD 只能注册单条指令,不能写复合逻辑(如多行 shell 脚本),如需复杂操作,应封装成脚本再用 RUN 调用;
- MAINTAINER 已废弃,建议用 LABEL 替代;
- ONBUILD 在现代 Docker 最佳实践中使用频率下降,因为多阶段构建和显式 COPY+RUN 更清晰可控;
- 若子镜像想跳过某个 ONBUILD(极少见),目前无原生跳过机制,只能重构父镜像或改用 ARG + 条件判断替代。











