Docker 输出中缺少层 ID

2024-03-27

我刚刚按照官方指南在 Ubuntu 上全新安装了 Docker:https://docs.docker.com/engine/installation/linux/ubuntulinux/ https://docs.docker.com/engine/installation/linux/ubuntulinux/

当我使用“sudo docker pull ubuntu”然后“sudo docker History ubuntu”拉取图像时,它会返回列中缺少的层 ID。使用文档示例(https://docs.docker.com/engine/reference/commandline/history/ https://docs.docker.com/engine/reference/commandline/history/)我的输出是:

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 才能正确显示。


正如您中提到的问题 20131 https://github.com/docker/docker/issues/20131#issuecomment-182294926,这可能是新的结果docker 1.10 内容寻址迁移 https://github.com/docker/docker/wiki/Engine-v1.10.0-content-addressability-migration

来自Docker 博客文章 https://blog.docker.com/2016/01/docker-1-10-rc/:

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

因此塔吉兹塔 https://github.com/thaJeztah评论:

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


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

奈杰尔·布朗 https://github.com/nbrownuk有一篇关于那些“丢失”图像的详细文章。

解释 Docker 镜像 ID http://www.windsock.io/explaining-docker-image-ids/

层或“差异”是在 Docker 映像构建过程中创建的,并在容器中运行命令时产生,从而生成新的或修改的文件和目录。
这些新的或修改的文件和目录被“提交”为新层。

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

变革的主要推动力之一来自缺乏检测图像内容在推送到注册表或从注册表中拉取期间是否被篡改的方法, 如那个码头工人中心 https://hub.docker.com/。这导致强烈的批评 https://github.com/docker/docker/issues/9719来自整个社区,并导致了一系列变化,最终产生了内容可寻址 ID。

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

现在通过摘要来标识层,其形式为算法:十六进制;

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

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

$ 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  

The <missing>值在IMAGE除了图像的一层之外的所有层的场,具有误导性并且有点不幸。它传达了错误的建议,但是没有错误,因为图层不再与相应的图像和 ID 同义.
我认为将该字段留空会更合适.

此外,图像 ID 似乎与最上层相关联,但实际上,图像 ID 不“属于”任何层。相反,这些层共同属于映像,并提供其文件系统定义。

但是(本地与远程图像):

Docker 主机上本地构建的镜像的处理方式略有不同.
本地构建的图像的通用内容保持不变 - 它是一个包含配置项的配置对象,包括层摘要的有序列表。

但是,当在本地 Docker 主机上构建映像期间提交层时,会同时创建“中间”映像.
就像所有其他图像一样,它有一个配置项,它是要合并为图像一部分的层摘要的列表,并且其 ID 或摘要包含配置对象的哈希值。中间图像没有名称标记,但它们确实有一个“父”键,其中包含父图像的 ID。

中间图像和对父图像的引用的目的是方便使用Docker的构建缓存 http://thenewstack.io/understanding-the-docker-cache-for-faster-builds/.

$ 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  

在此示例中,顶部两层是在本地映像构建期间创建的,而底层来自构建的基础映像(例如Dockerfile指令FROM debian https://docs.docker.com/engine/reference/builder/#from).

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

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

当本地构建的镜像被推送到注册表时,只有叶镜像及其组成层被上传,并且随后由另一个 Docker 主机拉取不会产生任何中间父镜像.

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

Finally:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 输出中缺少层 ID 的相关文章

随机推荐

  • 如何在不等待事件侦听器运行的情况下触发事件?

    我对 NET C 中的事件有疑问 我必须为几种情况编写代码 在这些情况下 我正在运行后台任务 并且我想通知主线程或控制器类发生了某些事情 例如任务已完成或完成了文件复制 但我不这样做不希望后台任务等待主线程的委托来处理事件 我想做一些类似消
  • java 最优雅的 isNumeric() 解决方案

    我现在正在将一小段 PHP 代码移植到 java 并且我依赖于该函数is numeric x 确定是否 x是一个数字还是不是一个数字 java中似乎没有等效的函数 而且我对目前找到的解决方案并不满意 我倾向于这里找到的正则表达式解决方案 h
  • 如何选择一个CSS使用最深的类?

    如何选择一个css类的使用最深 下面的列表中 如何选择使用最深的类 active 在这种情况下是 li 包裹 span Item 1 1 1 1 span ul li class active span Item 1 span ul li
  • angularjs:在 ng-switch 中更改控制器的父范围

    因此 我可以从子控制器更改模型值 但是当子控制器处于ng switch然后就不行了 为什么呢 我创建一个例子 http plnkr co edit R7D8Xa1HBmYnwffbHQGD p preview来展示它 避免这种情况的一种方法
  • 如何传递动态参数 Airflow 运算符?

    我正在使用 Airflow 在 Google Cloud Composer 上运行 Spark 作业 我需要 创建集群 用户提供的YAML参数 Spark 作业列表 作业参数也由每个作业 YAML 提供 借助 Airflow API 我可以
  • gcc 自动矢量化(未处理的数据引用)

    我不明白为什么这样的代码没有用 gcc 4 4 6 进行矢量化 int MyFunc const float pfTab float pfResult int iSize int iIndex for int i 0 i lt iSize
  • SqlServer -> MySQL 中的 FILESTREAM 存储等效吗?

    MySQL 版本中是否有等效项 5 5 Sql Server 中的 FILESTREAM 存储 目前来看 没有 只有BLOB CLOB等数据类型在MySQL中存储二进制数据
  • 解析 AWS Athena/AWS Glue 目录中某一列中包含换行符的 csv 文件

    我有如下示例数据 id log code sequence 100 sample lt gt lt gt O sample PILE UP 3 sample 20 7 M 101 sample 4 52 sample CM 21 7 M 1
  • Java FreeTTS 缺少语音

    我写了一个小程序 它应该简单地用 Java 进行文本到语音转换 我的班级看起来像这样 import com sun speech freetts Voice import com sun speech freetts VoiceManage
  • 排除 WCF DataContract 上的属性

    给定这样的 WCF 接口定义 是否有办法从 ComplexObject 响应值中排除属性 我想排除 ChildObjects 属性 我不想从属性定义中删除 DataMember 属性 因为我需要在另一种情况下将其序列化 ServiceCon
  • Java链表如何创建一个保存字符串和整数的节点?

    我一整天都在做这件事 我可以毫无问题地创建链接列表并显示 删除其中的数据 我的问题是 我不确定如何创建每个节点的航班链接列表 包括对乘客链接列表的引用 这是我的高级算法课上的作业 我在这里画一个空白 创建一个容纳乘客的对象 public c
  • 在 GO 中打印表格的有效方法

    我想知道一种在 Go 中打印表格的简单有效的方法 我找到的解决方案有效 但它真的很难看 非常感谢 outfile file tsv f err os Create outfile var buffer bytes Buffer buffer
  • HTML“object”标签是否有跨浏览器标准 onload 事件?

    我知道 IE 支持onreadystatechange属性上的object标签 但这似乎不是标准方式 因此所有其他浏览器都不支持它 更新 澄清一下 我不是在寻找 DOM Load 事件 而是在寻找object标签本身 例如object标签将
  • -bash:react-native:找不到命令

    我已经成功安装了brew node 4 0 watchman和flow 当我安装时我收到了以下信息npm install g react native cli Users home node bin react native gt User
  • Bower:安装后“未找到命令”

    当我执行时我似乎得到以下信息npm install bower g usr local share npm bin bower gt usr local share npm lib node modules bower bin bower
  • ADT 到 Android Studio 意外的顶级异常

    因此 我正在尝试将 Eclipse ADT 项目迁移到 Android Studio 中 我使用 appcompat v7 项目作为 eclipse 中的库项目 我按照 Android 开发网站上的说明进行操作 但仍然收到此错误 Error
  • `ejabberdctl start` 导致“内核 pid 终止”错误 - 我该怎么办?

    我用谷歌搜索了三个小时但没有结果 我有一个 ejabberd 安装 但不是使用 apt 安装的 它是从源代码安装的 其中没有名为 ejabberd 的程序 启动和停止 一切都是通过 ejabberdctl 进行的 它完美地运行了一个月 突然
  • CDN 上的 Dojo 与自己安装的 Dojo

    我使用了相当多的 Dojo 但迄今为止我仅通过包含来自 AOL Google 等 CDN 来使用它 托管 Dojo 副本而不是通过 CDN 使用它是否有优势 我没有太多需要改变代码库 但我想还有其他优点 缺点 通过托管您自己的 Dojo 环
  • Tornado 如何在任意位置提供单个静态文件?

    我正在使用 Tornado 开发一个简单的网络应用程序 它提供一些动态文件和一些静态文件 动态文件不是问题 但我在提供静态文件时遇到问题 我想做的是在访问 foo json URL 时提供文件 path to foo json 请注意 pa
  • Docker 输出中缺少层 ID

    我刚刚按照官方指南在 Ubuntu 上全新安装了 Docker https docs docker com engine installation linux ubuntulinux https docs docker com engine