我在docker文档中读到了如何使用ONBUILD指令,但它根本不清楚 有人可以向我解释一下吗?
答案 0 :(得分:45)
ONBUILD instruction对于自动构建所选软件堆栈非常有用。
Maven container旨在编译java程序。奇怪的是,你所有项目的Dockerfile需要做的是引用包含ONBUILD intructions的基础容器:
FROM maven:3.3-jdk-8-onbuild
CMD ["java","-jar","/usr/src/app/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar"]
基本图片Dockerfile告诉所有
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示例
答案 1 :(得分:3)
如docker docs所述:
当将映像用作另一构建的基础时,ONBUILD指令将在以后的时间向映像添加触发指令。触发器将在下游构建的上下文中执行,就像已将其插入下游Dockerfile中的FROM指令之后一样。
那是什么意思?让我们来看看这个Nodejs Dockerfile:
sub("[-.].*", "", DT)
#[1] "A1" "A1" "A3" "A200" "AX3" "B18" "F16" "Z32" "E300" "C61" "TXDS"
在您自己的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" ]
时,您将得到一个映像,这意味着FROM node:0.12.6-onbuild
命令已经运行,因此指令也已经执行,但是除了以build
开头的广告。这些已推迟到下一次,当下游构建(当从您自己的Dockerfile构建映像时)使用该映像作为基础(ONBUILD
)时。
您现在不能只调用
FROM node:0.12.6-onbuild
和ADD
,因为您还没有访问应用程序源代码的权限,并且每种应用程序版本的代码都不同。
是的!包含onbuild指令的映像尚未在您的计算机上构建,因此尚无法访问RUN
。
然后,当您构建自己的Dockerfile时,在执行文件中的任何指令之前,构建器将寻找package.json
触发器,这些触发器在构建时会添加到父映像的元数据中。
这免除了您自己执行这些命令的麻烦,实际上就像这些命令是在您自己的Dockerfile中编写的一样。
最后,他们添加:
您可以简单地为应用程序开发人员提供一个样板Dockerfile,以将其复制粘贴到他们的应用程序中,但这效率低下,容易出错且难以更新,因为它与特定于应用程序的代码混合在一起。
问题是,如果在样板Dockerfile中修改了这些指令,那么您也将不得不在Dockerfile中对其进行修改。但是感谢ONBUILD
指令,我们不必为此担心。