我在 Docker 文档中读到如何使用 ONBUILD 指令,但是它根本不清楚。 有人能给我解释一下吗?
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)。
FROM node:0.12.6-onbuild
build
ONBUILD
现在不能只调用 ADD和 RUN,因为您还没有访问应用程序源代码,而且对于每个应用程序构建它们都是不同的。
ADD
RUN
没错! 包含构建指令的映像不是在您的机器上构建的,所以它还不能访问 package.json。
package.json
然后,当您构建自己的 Dockerfile 时,在执行文件中的任何指令之前,构建器将查找 ONBUILD触发器,这些触发器在构建时被添加到父映像的元数据中。
这样就省去了自己执行这些命令的麻烦,实际上就好像这些命令是在您自己的 Dockerfile 中编写的一样。
最后,他们补充道:
您可以简单地向应用程序开发人员提供一个模板 Dockerfile,以便将其复制粘贴到应用程序中,但这样做效率低下、容易出错并且难以更新,因为它与应用程序特定的代码混合在一起。
问题是,如果这些指令在模板 Dockerfile 中被修改,那么您也必须在 Dockerfile 中修改它们。但是感谢 ONBUILD指令,我们不必担心它。