Dockerfile编译指令
我在docker文档中读到如何使用ONBUILD指令,但一点也不清楚。Dockerfile编译指令,docker,Docker,我在docker文档中读到如何使用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"] 基本图像的所有信息
有人能给我解释一下吗?对于自动构建所选软件堆栈非常有用 例子 设计用于编译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中,当您从node:0.12.6-onbuild执行时,您将获得一个映像,这意味着build
命令已经运行,因此指令也已经执行,但是除了那些以onbuild
开头的指令外,其他指令都已执行。当下游构建(当您的映像是从自己的Dockerfile中构建的)使用此映像作为基础时(来自节点:0.12.6-onbuild
),这些已被推迟到另一个时间
您现在不能只调用ADD
和RUN
,因为您还没有访问应用程序源代码的权限,而且每个应用程序构建的源代码都会有所不同
没错!包含onbuild指令的映像不是在您的计算机上生成的,因此它还不能访问package.json
然后,当您构建自己的Dockerfile时,在执行文件中的任何指令之前,构建器将查找ONBUILD
触发器,这些触发器在构建父映像时添加到父映像的元数据中
这就省去了您自己执行这些命令的麻烦,实际上这些命令好像是在您自己的Dockerfile中编写的
最后,他们补充说:
您可以简单地为应用程序开发人员提供一个样板Dockerfile,以便将粘贴复制到他们的应用程序中,但这样做效率低,容易出错,而且很难更新,因为它混合了特定于应用程序的代码
问题是,如果这些指令在样板Dockerfile中被修改,那么您也必须在Dockerfile中修改它们。但是多亏了ONBUILD
指令,我们不必担心它。您哪部分不明白如果您正在构建一个图像,该图像将用作构建其他图像的基础,则此选项非常有用
,但我可以如何处理该图像。请给我举个例子。文档中也有例子。首先,您可以使用所需的OS库(curl、gd等)创建自定义映像dockerfile,并添加onbuild指令以稍后添加源代码。示例onbuild add src/
稍后您将创建另一个dockerfile,但使用先前创建的映像(来自指令)并在其上堆叠源代码。所以你有冻结操作系统级库和源代码的图像;这方面的例子很多。例如,请参阅。'instruction'有一个输入错误,如果StackOverflow只允许进行1个字符的编辑,我会修复它,不会打扰任何人。ONBUILD指令会向映像中添加一个触发器指令,稍后执行。