我在Docker文档中读到了ONBUILD指令的使用方法,但是它并不清楚。
请问有人可以解释一下吗?
ONBUILD指令非常有用,可以自动化构建所选择的软件堆栈。
Maven容器专为编译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
根据docker文档的说明:
ONBUILD指令为镜像添加触发指令,以便在将镜像用作构建的基础时,在稍后的时间执行。 在下游Dockerfile中执行触发器,就好像它已立即插入到下游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
)。
没错!包含onbuild指令的镜像并没有在你的机器上构建,所以它还没有访问现在你不能只是调用
ADD
和RUN
,因为你还没有访问应用程序源代码,并且每个应用程序构建的源代码都不同。
package.json
的权限。ONBUILD
触发器,这些触发器是在构建父镜像时添加到元数据中的。问题是如果这些指令在模板Dockerfile中被修改,那么你也必须在自己的Dockerfile中进行修改。但是由于你可以简单地提供一个样板Dockerfile给应用程序开发人员复制粘贴,但那样效率低下、容易出错并且难以更新,因为它与特定于应用程序的代码混在一起。
ONBUILD
指令,我们不需要担心这个问题。
如果你正在构建一个将被用作基础来构建其他镜像的镜像,这将非常有用。
- Vaidas Lungisonbuild add src/
然后,您可以创建另一个dockerfile,但使用先前创建的图像(FROM指令),并在其上堆叠源代码。因此,您将获得具有冻结操作系统级别库和源代码的图像。 - Vaidas Lungis