Dockerfile ONBUILD指令

时间:2016-01-18 20:03:06

标签: docker

我在docker文档中读到了如何使用ONBUILD指令,但它根本不清楚 有人可以向我解释一下吗?

2 个答案:

答案 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-onbuildADD,因为您还没有访问应用程序源代码的权限,并且每种应用程序版本的代码都不同。

是的!包含onbuild指令的映像尚未在您的计算机上构建,因此尚无法访问RUN

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

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

最后,他们添加:

  

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

问题是,如果在样板Dockerfile中修改了这些指令,那么您也将不得不在Dockerfile中对其进行修改。但是感谢ONBUILD指令,我们不必为此担心。