我试图弄清楚有关镜像 ID、清单和摘要的 docker 术语,以便了解 docker 如何维护分布式镜像的完整性。并且有一个(许多)意想不到的点。我刚刚保存了一个现有镜像,将其解压回来,但无法理解其manifest.json
文件中的内容:
$ docker save 000908da321f > a.tar
$ tar -xvf ./a.tar -C a
$ ls a
blobs index.json manifest.json oci-layout
{
"schemaVersion":2,
"mediaType":"application/vnd.oci.image.index.v1+json",
"manifests":
[
{
"mediaType":"application/vnd.oci.image.manifest.v1+json",
"digest":"sha256:dbe15f62d97cfdb1271a9612e4df8bd5d79b11404dcaed42b82e4cf796338f37",
"size":1011
}
]
}
我可以dbe15
在 中找到a/blob/sha256/
。这也是有道理的:它是一个mediaType manifest
带有config
和 的layers
内部。重新制作带有 的主题标签sha256sum
可以匹配它们。
但manifest.json
它不遵循图像规范架构。它是一个列表,并且没有schemaVersion
and mediaType
:
[
{
"Config": "blobs/sha256/000908da321ffa9418f599f3476fece162f3903f3f2e9fdd508c8b91ee9008ff",
"Layers": [
"blobs/sha256/08000c18d16dadf9553d747a58cf44023423a9ab010aab96cf263d2216b8b350",
...
],
"LayerSources": { ... },
"RepoTags": null
}
]
它看起来有点像,但实际上不是。这个文件是什么?当它不遵循图像清单的架构时,docker image inspect <image ID>
调用它的原因是什么?manifest.json
这
manifest.json
是跟踪 输出的原始方法docker save
。它列出了包含的图像、它们的标签以及将图像重新加载到 docker 引擎所需的指针。它是一种 docker 特定格式,不属于 OCI 规范的一部分。输出中的新内容
docker save
是过渡到使用来自moby/moby PR#44833的OCI 图像布局。它添加了、、重命名了 blob,并提供了支持更多用例的能力(与工具的兼容性和对多平台图像的支持)。index.json
oci-layout
这两种格式兼容,因此将它们放在同一个
docker save
输出中可以让旧版本的 Docker 使用该输出。这一切对于你所述的目标来说似乎都无关紧要:
OCI 图像规范涵盖了这一点,而无需剖析
docker save
输出。它由内容寻址存储、Merkle 树和有向无环图提供。我将从学习这些开始。