Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dockerfile编译指令_Docker - Fatal编程技术网

Dockerfile编译指令

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"] 基本图像的所有信息

我在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"]
基本图像的所有信息

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指令会向映像中添加一个触发器指令,稍后执行。