gpt4 book ai didi

docker - 为什么摘要不同取决于注册表?

转载 作者:行者123 更新时间:2023-12-02 18:15:37 24 4
gpt4 key购买 nike

AFAIK,图像摘要是图像 list 主体的哈希。
当我拉 busybox来自 docker hub 的图像,并将其推送到我的私有(private)注册表,摘要会有所不同。

$ docker pull busybox
...
Digest: sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4
Status: Downloaded newer image for busybox:latest

$ docker tag busybox myregistry/busybox
$ docker push myregistry/busybox
...
08c2295a7fa5: Pushed
latest: digest: sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac size: 527

$ docker images --digests
myregistry/busybox latest sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac efe10ee6727f 2 weeks ago 1.13MB
busybox latest sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4 efe10ee6727f 2 weeks ago 1.13MB
图像根本没有改变,并且图像ID彼此相同。
但是为什么图像摘要会有所不同?

更新:
有趣的是,来自另一个私有(private)注册表的摘要与我的私有(private)注册表的摘要完全相同。
$ docker image inspect efe10ee6727f
...
"RepoDigests": [
"myregistry/busybox@sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac",
"busybox@sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4",
"anotherregistry/busybox@sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac"
],

最佳答案

您正在查看的摘要是注册表摘要,它与镜像 ID 摘要不同。您可以拥有一个图像 id,该图像 id 对它被推送的所有位置都有不同的注册表引用(可能还有摘要)。您可以在检查输出中看到两个 id:

$ docker inspect busybox --format 'Id: {{.Id}}
Repo Digest: {{index .RepoDigests 0}}'
Id: sha256:efe10ee6727fe52d2db2eb5045518fe98d8e31fdad1cbdd5e1f737018c349ebb
Repo Digest: busybox@sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4
如果注册表使用旧的 v1 manifest ,则存储库名称和标记是该 list 的一部分,这意味着它会随着它在注册表之间移动而改变:
{
"name": <name>,
"tag": <tag>,
"fsLayers": [
{
"blobSum": "<digest>"
},
...
]
],
"history": <v1 images>,
"signature": <JWS>
}
但是对于 OCI manifestsDocker's v2 manifests ,情况不再如此,您应该看到相同图像的相同注册表摘要:
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 7023,
"digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 32654,
"digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 16724,
"digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 73109,
"digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
}
]
}
摘要本身是内容的 sha256 摘要,您也可以在 OCI's implementation 中找到它。当您在本地拉取图像时,有些事情会发生变化,包括被解压缩的层,并且多平台图像被取消引用到您的本地平台。由于这些更改,内容的摘要将更改,并且图像 ID 将与注册表摘要不匹配。
因此,要比较注册表之间的图像,请确保您指定需要带有接受 header 的 v2 模式,否则注册表会将结果转换回 v1 模式。在 curl 中,传递这些标题看起来像:
curl \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
-H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \
http://$registry/v2/$repo/manifests/$tag

关于docker - 为什么摘要不同取决于注册表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45533005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com