Dockerfile ONBUILD 指令

我在 Docker 文档中读到如何使用 ONBUILD 指令,但是它根本不清楚。
有人能给我解释一下吗?

42750 次浏览

ONBUILD 指令对于自动构建您选择的软件栈非常有用。

例子

玛文容器被设计用来编译 java 程序。神奇的是,您的项目的 Dockerfile 需要做的只是引用包含 ONBUILD 指令的基本容器:

FROM maven:3.3-jdk-8-onbuild
CMD ["java","-jar","/usr/src/app/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar"]

基本图像的 文件夹说明了一切

FROM maven:3-jdk-8


RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app


ONBUILD ADD . /usr/src/app


ONBUILD RUN mvn install

有一个同时安装了 Java 和 Maven 的基本映像,以及一系列复制文件和运行 Maven 的指令。

下面的答案给出了一个 Java 示例

正如 码头文件所指出的:

ONBUILD 指令向映像添加了一个触发器指令,将在以后将该映像用作另一个构建的基础时执行。触发器将在下游构建的上下文中执行,就好像它是在下游 Dockerfile 中的 FROM 指令之后立即插入的一样。

那么这意味着什么呢? 让我们看看这个 Nodejs Dockerfile:

FROM node:0.12.6


RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app


ONBUILD COPY package.json /usr/src/app/
ONBUILD RUN npm install
ONBUILD COPY . /usr/src/app


CMD [ "npm", "start" ]

在您自己的 Dockerfile 中,当您执行 FROM node:0.12.6-onbuild时,您将获得一个图像,这意味着 build命令已经运行,因此指令也已经执行,但是除了以 ONBUILD开始的指令之外,其他指令都已经执行。这些已经推迟到下一次构建时(当您的映像是从您自己的 Dockerfile 构建时)使用这个映像作为基础(FROM node:0.12.6-onbuild)。

现在不能只调用 ADDRUN,因为您还没有访问应用程序源代码,而且对于每个应用程序构建它们都是不同的。

没错! 包含构建指令的映像不是在您的机器上构建的,所以它还不能访问 package.json

然后,当您构建自己的 Dockerfile 时,在执行文件中的任何指令之前,构建器将查找 ONBUILD触发器,这些触发器在构建时被添加到父映像的元数据中。

这样就省去了自己执行这些命令的麻烦,实际上就好像这些命令是在您自己的 Dockerfile 中编写的一样。

最后,他们补充道:

您可以简单地向应用程序开发人员提供一个模板 Dockerfile,以便将其复制粘贴到应用程序中,但这样做效率低下、容易出错并且难以更新,因为它与应用程序特定的代码混合在一起。

问题是,如果这些指令在模板 Dockerfile 中被修改,那么您也必须在 Dockerfile 中修改它们。但是感谢 ONBUILD指令,我们不必担心它。