DockerHub:sha 摘要不匹配
DockerHub: sha digest doesn't match
我想确定 DockerHub 中最新 docker 图像的 sha 摘要:
如果我尝试拉取最新图像,我可以看到摘要
# docker pull mysql:latest
...
Digest: sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
所以摘要是 c93ba1
但是如果我去https://hub.docker.com我会看到
所以有 2 个摘要:511ca265b41c
和 9a355d5c4ec0
。
此外,如果我尝试提取任何指定的摘要:
# docker pull mysql@sha256:9a355d5c4ec0351a954b11b494c597cd4e6ab2c8a04ce69c5f8332819890c43e
Error response from daemon: manifest for mysql@sha256:9a355d5c4ec0351a954b11b494c597cd4e6ab2c8a04ce69c5f8332819890c43e not found: manifest unknown: manifest unknown
# docker pull mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf
Error response from daemon: manifest for mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf not found: manifest unknown: manifest unknown
但是,如果我尝试使用从 pull 命令获得的那个,它会起作用:
docker pull mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169: Pulling from library/mysql
Digest: sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
Status: Image is up to date for mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
docker.io/library/mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
我做错了什么?
有没有办法在不拉取图像的情况下获取摘要?
更新:
使用 Docker Desktop 2.2
在 MacO 上再次重复相同的过程
docker pull mysql:8
8: Pulling from library/mysql
...
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Downloaded newer image for mysql:8
docker.io/library/mysql:8
然后在 docker 中心
然后
docker image inspect mysql:8
[
{
"Id": "sha256:c8ad2be69a220e93826a6308458627b8d5624dc981050fabf950e5de5a7a08a8",
"RepoTags": [
"mysql:8"
],
"RepoDigests": [
"mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe"
]
和
docker pull mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c: Pulling from library/mysql
Digest: sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
Status: Downloaded newer image for mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
docker.io/library/mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
docker pull mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe: Pulling from library/mysql
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Image is up to date for mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
docker.io/library/mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
当我在 Linux VM 上执行相同操作时:
sudo docker pull mysql:8
8: Pulling from library/mysql
...
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Downloaded newer image for mysql:8
docker.io/library/mysql:8
所以我不知道这里发生了什么
奇怪的是,当我访问 dockerhub 时,mysql:latest(现在)有一个不同的摘要,它报告为一个月前更新:
在您的示例中,c93va1
是适合您的体系结构的正确散列。你在使用 Mac 吗?其他哈希值(如果有效)用于 ARM 和 AMD64 上的 Linux 的图像。这可以解释您看到的差异吗?
我发现 dockerhub 在处理清单时不太理想。 Google Container Registry 显示图像的清单以及哈希,因此更容易证实。
查看我遇到的一个相关问题的答案,希望对您有所帮助:
根据 this github comment,显然 CLI 在计算 sha256 摘要时使用包含所有不同机器架构选项的清单,而 DockerHub 页面上的每个摘要都是使用仅包含特定个体的清单计算的架构。
更新:
我已经有一段时间没查到这个了,所以我不记得细节了,但要了解更多信息,请查看 this page。 我相信它与图像清单的 sha 和 清单列表的 sha 之间的区别有关...
当图像被打包为 multi-platform 图像时(即使该打包只有一个平台),您在拉取图像时看到的是清单列表或 OCI 索引的摘要。要使用问题中的示例:
$ regctl manifest get mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe --format body | jq .
{
"manifests": [
{
"digest": "sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c",
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"platform": {
"architecture": "amd64",
"os": "linux"
},
"size": 2828
}
],
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"schemaVersion": 2
}
这是一个 docker 清单列表,其中包含一个特定于平台的清单(针对 linux/amd64),其中包含您在 Docker Hub 上看到的摘要 sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
。 Docker 在拉取时跟踪清单列表,但在拉取到 docker 引擎时它总是将 multi-platform 图像取消引用到单个平台。
在部署中固定摘要时,您通常希望使用 multi-platform 摘要。这允许在不同的平台上使用相同的摘要,尽管在这种特定情况下这不太重要。要获得该摘要,可以使用 regclient、crane 和 skopeo 等工具。并且 buildx 还包含一个隐藏命令 docker buildx imagetools inspect
可以做到这一点。
这不是一项功能,它有一个未解决的 long-running Github 问题 here,您可以在其中参与并投票以更快地修复它。
在 SO 上的类似问题中,您还可以找到一个使用 curl
的解决方法脚本,它会让您正确地 server-side 摘要:
否则 CLI 仍然与 Hub 不同步,甚至 docker inspect
。例如:
Docker 中心 (link):
bitnami/minideb:buster
Digest:sha256:b4d0417f742c591cad881ba5458719edb2b8166103413ffc4e1e480455892097
对比本地 docker inspect
:
IMAGE_NAME_TAGGED=bitnami/minideb:buster && docker inspect $IMAGE_NAME_TAGGED | grep sha
"Id": "sha256:0def18b69c0b60f4d4ceb22f5aad596dffbb6d1b6089aff15158a4cde5276e2d",
"bitnami/minideb@sha256:0a96a8ec61c52b638c824bc3463c9009844d80d5e2b1dfe77b6c10a31a27684d"
"sha256:4c16ec6258b6cd4630c3d8e7c1389981064e2719d560d5f08b9cfff1082fa86f"
我不确定切换到 podman
是否会改善情况,因为在 this 重新打开的问题中,用户描述了摘要不匹配的类似问题。
我想确定 DockerHub 中最新 docker 图像的 sha 摘要:
如果我尝试拉取最新图像,我可以看到摘要
# docker pull mysql:latest
...
Digest: sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
所以摘要是 c93ba1
但是如果我去https://hub.docker.com我会看到
所以有 2 个摘要:511ca265b41c
和 9a355d5c4ec0
。
此外,如果我尝试提取任何指定的摘要:
# docker pull mysql@sha256:9a355d5c4ec0351a954b11b494c597cd4e6ab2c8a04ce69c5f8332819890c43e
Error response from daemon: manifest for mysql@sha256:9a355d5c4ec0351a954b11b494c597cd4e6ab2c8a04ce69c5f8332819890c43e not found: manifest unknown: manifest unknown
# docker pull mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf
Error response from daemon: manifest for mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf not found: manifest unknown: manifest unknown
但是,如果我尝试使用从 pull 命令获得的那个,它会起作用:
docker pull mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169: Pulling from library/mysql
Digest: sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
Status: Image is up to date for mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
docker.io/library/mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
我做错了什么? 有没有办法在不拉取图像的情况下获取摘要?
更新: 使用 Docker Desktop 2.2
在 MacO 上再次重复相同的过程docker pull mysql:8
8: Pulling from library/mysql
...
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Downloaded newer image for mysql:8
docker.io/library/mysql:8
然后在 docker 中心
然后
docker image inspect mysql:8
[
{
"Id": "sha256:c8ad2be69a220e93826a6308458627b8d5624dc981050fabf950e5de5a7a08a8",
"RepoTags": [
"mysql:8"
],
"RepoDigests": [
"mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe"
]
和
docker pull mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c: Pulling from library/mysql
Digest: sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
Status: Downloaded newer image for mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
docker.io/library/mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
docker pull mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe: Pulling from library/mysql
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Image is up to date for mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
docker.io/library/mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
当我在 Linux VM 上执行相同操作时:
sudo docker pull mysql:8
8: Pulling from library/mysql
...
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Downloaded newer image for mysql:8
docker.io/library/mysql:8
所以我不知道这里发生了什么
奇怪的是,当我访问 dockerhub 时,mysql:latest(现在)有一个不同的摘要,它报告为一个月前更新:
在您的示例中,c93va1
是适合您的体系结构的正确散列。你在使用 Mac 吗?其他哈希值(如果有效)用于 ARM 和 AMD64 上的 Linux 的图像。这可以解释您看到的差异吗?
我发现 dockerhub 在处理清单时不太理想。 Google Container Registry 显示图像的清单以及哈希,因此更容易证实。
查看我遇到的一个相关问题的答案,希望对您有所帮助:
根据 this github comment,显然 CLI 在计算 sha256 摘要时使用包含所有不同机器架构选项的清单,而 DockerHub 页面上的每个摘要都是使用仅包含特定个体的清单计算的架构。
更新: 我已经有一段时间没查到这个了,所以我不记得细节了,但要了解更多信息,请查看 this page。 我相信它与图像清单的 sha 和 清单列表的 sha 之间的区别有关...
当图像被打包为 multi-platform 图像时(即使该打包只有一个平台),您在拉取图像时看到的是清单列表或 OCI 索引的摘要。要使用问题中的示例:
$ regctl manifest get mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe --format body | jq .
{
"manifests": [
{
"digest": "sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c",
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"platform": {
"architecture": "amd64",
"os": "linux"
},
"size": 2828
}
],
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"schemaVersion": 2
}
这是一个 docker 清单列表,其中包含一个特定于平台的清单(针对 linux/amd64),其中包含您在 Docker Hub 上看到的摘要 sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
。 Docker 在拉取时跟踪清单列表,但在拉取到 docker 引擎时它总是将 multi-platform 图像取消引用到单个平台。
在部署中固定摘要时,您通常希望使用 multi-platform 摘要。这允许在不同的平台上使用相同的摘要,尽管在这种特定情况下这不太重要。要获得该摘要,可以使用 regclient、crane 和 skopeo 等工具。并且 buildx 还包含一个隐藏命令 docker buildx imagetools inspect
可以做到这一点。
这不是一项功能,它有一个未解决的 long-running Github 问题 here,您可以在其中参与并投票以更快地修复它。
在 SO 上的类似问题中,您还可以找到一个使用 curl
的解决方法脚本,它会让您正确地 server-side 摘要:
否则 CLI 仍然与 Hub 不同步,甚至 docker inspect
。例如:
Docker 中心 (link):
bitnami/minideb:buster
Digest:sha256:b4d0417f742c591cad881ba5458719edb2b8166103413ffc4e1e480455892097
对比本地 docker inspect
:
IMAGE_NAME_TAGGED=bitnami/minideb:buster && docker inspect $IMAGE_NAME_TAGGED | grep sha
"Id": "sha256:0def18b69c0b60f4d4ceb22f5aad596dffbb6d1b6089aff15158a4cde5276e2d",
"bitnami/minideb@sha256:0a96a8ec61c52b638c824bc3463c9009844d80d5e2b1dfe77b6c10a31a27684d"
"sha256:4c16ec6258b6cd4630c3d8e7c1389981064e2719d560d5f08b9cfff1082fa86f"
我不确定切换到 podman
是否会改善情况,因为在 this 重新打开的问题中,用户描述了摘要不匹配的类似问题。