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
Ubuntu Docker在输出中缺少层ID_Ubuntu_Docker - Fatal编程技术网

Ubuntu Docker在输出中缺少层ID

Ubuntu Docker在输出中缺少层ID,ubuntu,docker,Ubuntu,Docker,我刚刚在Ubuntu上使用官方指导原则重新安装了Docker: 当我使用“sudo docker pull ubuntu”和“sudo docker history ubuntu”提取图像时,它会在列中返回丢失的层ID。使用文档示例()我的输出是: IMAGE CREATED CREATED BY SIZE COMMENT 3e23a5875458 8 days ago /bin/sh -c #(nop) ENV LC_ALL=C.UTF-8 0 B "missing" 8 days ago /

我刚刚在Ubuntu上使用官方指导原则重新安装了Docker:

当我使用“sudo docker pull ubuntu”和“sudo docker history ubuntu”提取图像时,它会在列中返回丢失的层ID。使用文档示例()我的输出是:

IMAGE CREATED CREATED BY SIZE COMMENT
3e23a5875458 8 days ago /bin/sh -c #(nop) ENV LC_ALL=C.UTF-8 0 B
"missing" 8 days ago /bin/sh -c dpkg-reconfigure locales && loc 1.245 MB
"missing" 8 days ago /bin/sh -c apt-get update && apt-get install 338.3 MB
等等。仅显示基本层ID,其余为“缺失”。我试着在另一台连接到不同网络的Ubuntu机器上安装,我下载的任何图像都有同样的问题

有人知道这是什么原因吗,或者能帮我解决吗?我依赖于这个层ID,因为我正在收集一些关于层的可重用性的统计数据,所以我需要正确显示这个ID

谢谢你

正如你在报告中提到的,这可能是新的

从:

从v1.10开始,我们完全改变了Docker处理磁盘上图像数据的方式。
以前,每个图像和层都使用随机分配的UUID。
在1.10中,我们基于图像和层数据的安全散列,使用ID实现了一种内容寻址方法

这就是为什么评论:

我认为这是意料之中的;内容寻址存储不再使用“父”图像将图像层链接在一起。
新提取的图像也不再显示中间图像(这些“缺失”的图像将仅显示主机上存在但已迁移到新存储的图像)


2016年6月更新(3个月后)

有一篇关于这些“缺失”图像的详细文章

在Docker映像生成过程中创建一个层或“diff”,并在容器中运行命令时产生结果,从而生成新的或修改过的文件和目录。
这些新的或修改过的文件和目录作为新层“提交”

历史上(Docker v1.10之前),每次由于提交操作而创建一个新层时,Docker都会创建一个相应的映像,该映像由随机生成的256位UUID标识,通常称为映像ID

改变的一个主要驱动因素是缺少一种方法来检测图像的内容是否在推送或从注册表中拉出的过程中被篡改。这导致了整个社区的,并导致了一系列变化,最终导致了内容寻址ID

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

层现在由摘要标识,其形式为算法:hex

Docker映像现在由一个配置对象组成,其中(除其他外)包含一个有序的层摘要列表,这使Docker引擎能够参照层摘要而不是父映像来组装容器的文件系统

因此,当从注册表中提取Docker图像,并使用Docker history命令显示其内容时,输出提供类似以下内容:

在本例中,顶部的两层是在本地映像构建期间创建的,而底部的层来自构建的基础映像(例如)

我们可以使用
docker inspect
命令查看与图像相关的图层摘要:

docker history
命令将图像显示为有四层,但
docker inspect
仅建议三层。
这是因为两个
CMD
指令为图像生成元数据,不添加任何内容,因此“diff”为空。
摘要
5f70bf18a08a
是空层的SHA256散列,由两个相关层共享

当本地构建的映像被推送到注册表时,只有叶映像与其组成层一起上载,而另一个Docker主机的后续拉取不会产生任何中间父映像

这是因为,一旦通过注册表将映像提供给不同Docker主机上的其他潜在用户,它实际上将变为只读,并且不再需要支持生成缓存的组件。
而不是图像ID,
被插入历史输出中的相应位置。

最后:

Docker在Docker主机上用于层“diff”的摘要包含diff的tar存档内容的sha256哈希。
在层作为推送的一部分上载到注册表之前,它会被压缩以提高带宽效率。还会创建一个清单来描述图像的内容,其中包含压缩层内容的摘要因此,清单中各层的摘要与未压缩状态下生成的摘要不同。


谢谢你,这至少证实了问题的来源。你知道有什么变通方法可以让我检查一个图层是否被其他docker图像重用吗?我想我现在必须比较每一层的数据了?@Piet我还不知道:我现在正在1.10中移植我自己的图像!感谢您的详细写作,非常翔实!你知道有没有办法让Docker的构建缓存识别并利用从远程注册表中提取的叶图像中的层?我从注册表中取下一个图像,如您所述,除了最后一层之外,所有层都有一个注释,以指示这些层不是中间图像。但是本地重建(从同一docker文件)似乎没有使用我从远程注册表提取的图像中包含的任何层。@dm03514不确定,但首先,我们谈论的是什么docker版本?这个形象是用码头建造的吗
$ docker history swarm
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT  
c54bba046158        9 days ago          /bin/sh -c #(nop) CMD ["--help"]                0 B  
<missing>           9 days ago          /bin/sh -c #(nop) ENTRYPOINT &{["/swarm"]}      0 B  
<missing>           9 days ago          /bin/sh -c #(nop) VOLUME [/.swarm]              0 B  
<missing>           9 days ago          /bin/sh -c #(nop) EXPOSE 2375/tcp               0 B  
<missing>           9 days ago          /bin/sh -c #(nop) ENV SWARM_HOST=:2375          0 B  
<missing>           9 days ago          /bin/sh -c #(nop) COPY dir:b76b2255a3b423981a   0 B  
<missing>           9 days ago          /bin/sh -c #(nop) COPY file:5acf949e76228329d   277.2 kB  
<missing>           9 days ago          /bin/sh -c #(nop) COPY file:a2157cec2320f541a   19.06 MB  
$ docker history jbloggs/my_image:latest 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT  
26cca5b0c787        52 seconds ago      /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin/b   0 B  
97e47fb9e0a6        52 seconds ago      /bin/sh -c apt-get update &&     apt-get inst   16.98 MB  
1742affe03b5        13 days ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B  
<missing>           13 days ago         /bin/sh -c #(nop) ADD file:5d8521419ad6cfb695   125.1 MB