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
多级docker图像是否具有相同的层?_Docker_Dockerfile - Fatal编程技术网

多级docker图像是否具有相同的层?

多级docker图像是否具有相同的层?,docker,dockerfile,Docker,Dockerfile,假设我决定进行以下多级构建: FROM node:8.6-alpine AS build1 #some other commands FROM node:8.5-alpine AS build2 # yet another commands build1和build2之间肯定有一些共同的层。docker会复制层,还是以某种方式附加引用已构建的层?下一步是在新机器上构建docker文件的结果: # docker build -t test:1 . Sending build context to

假设我决定进行以下多级构建:

FROM node:8.6-alpine AS build1
#some other commands
FROM node:8.5-alpine AS build2
# yet another commands

build1和build2之间肯定有一些共同的层。docker会复制层,还是以某种方式附加引用已构建的层?

下一步是在新机器上构建docker文件的结果:

# docker build -t test:1 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM node:8.6-alpine AS build1
8.6-alpine: Pulling from library/node
88286f41530e: Pull complete
d0e8a23136b3: Pull complete
5ad5b12a980e: Pull complete
Digest: sha256:60cd58a7a2bd9fec161f53f8886e451f92db06b91f4f72d9188eeea040d195eb
Status: Downloaded newer image for node:8.6-alpine
 ---> b7e15c83cdaf
Step 2/2 : FROM node:8.5-alpine AS build2
8.5-alpine: Pulling from library/node
88286f41530e: Already exists
aa0be12c5610: Pull complete
719d346e6de2: Pull complete
Digest: sha256:945cf56668d3e58a3b045291564963ccde29a68da9c1483e19d8a0b06749db06
Status: Downloaded newer image for node:8.5-alpine
 ---> 7a779c246a41
Successfully built 7a779c246a41
Successfully tagged test:1
从输出中可以看到图像id
88286f41530e
被重用为
已存在

docker图像
输出:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
node                8.6-alpine          b7e15c83cdaf        13 months ago       67.2MB
node                8.5-alpine          7a779c246a41        14 months ago       67MB
因此,多重构建中第一阶段的基本映像也保留在缓存中

由此:

自Docker v1.10以来,通常情况下,图像和层不再是同义词。 相反,映像直接引用一个或多个层,这些层最终构成派生容器的文件系统

因此,当一些图像被重用时,层肯定会被重用

当然,这取决于您在multibuild中使用的基础映像,它们需要一些可重用的东西


不管怎么说,我认为多版本只是比传统版本增加了一些技巧,但层重用机制是相同的。

我相信普通的
docker版本
层缓存将适用,但还有其他更好的答案

来自ubuntu:18.04的第一个 运行apt获取更新\ &&DEBIAN_前端=非交互\ apt get install-y--不建议安装\ 蟒蛇3 先运行echo 来自ubuntu:18.04秒 运行apt获取更新\ &&DEBIAN_前端=非交互\ apt get install-y--不建议安装\ 蟒蛇3 运行echo秒 规则是,您必须从完全相同的基本图像开始(在您的示例中,没有共享内容),并且必须重复完全相同的命令(或复制完全相同的文件内容);一旦偏离此路径,就不会共享任何内容,包括在以后的任何相同命令中

你可以这样做,如果你真的想分享一些基本层,最好明确地这样做

来自ubuntu:18.04作为基础
运行apt获取更新\
&&DEBIAN_前端=非交互\
apt get install-y--不建议安装\
蟒蛇3
先从基地出发
先运行echo
从第二垒开始
运行echo秒
对于多阶段构建,更常见的情况是具有非常不同的“构建”和“运行时”映像,因此这通常不适用

来自golang:1.11版本的

WORKDIR/go/src/github.com/me/myapp
收到/
运行go安装。
来自阿尔卑斯山
复制--from=build/go/bin/myapp/usr/bin
CMD[“myapp”]

多级构建的有趣结果只是最后一张图像。在您的示例中,如果两个基础图像共享一些层,则只有共享层。您的意思是第一个图像将被丢弃?或多或少是的。它仍将在生成缓存中,以加速以后的生成,但不会显示在结果映像中。这就是这个特性背后的全部思想。构建应用程序所需的东西在运行时不是必需的。据我所知,docker在构建图像时,会按层进行操作,以便重用这些层。因此,对于任何
docker构建
,无论是否是多级的,都应该是这样。