将带有两个标签的图像推送到 gcr.io 会产生两个不同的图像

将带有两个标签的图像推送到 gcr.io 会产生两个不同的图像

我正在执行以下操作:

docker build-t gcr.io/projid/imgname:333 -t gcr.io/projid/imgname:最新。

docker 登录-u _json_key -p“$(cat /secrets/service-account.json)”https://gcr.io

docker pushgcr.io/projid/图片名称:333

docker pushgcr.io/projid/imgname:latest

第一个推送命令的输出:

Pushing to google container registry ...
The push refers to a repository [gcr.io/projid/imgname]
24af4f7c7118: Preparing
17b0972980d8: Preparing
6d6a6425aacb: Preparing
809c8c0dd73c: Preparing
e8d45b8ab3ca: Preparing
e8fa134cb7b8: Preparing
7cbcbac42c44: Preparing
e8fa134cb7b8: Waiting
7cbcbac42c44: Waiting
809c8c0dd73c: Layer already exists
e8d45b8ab3ca: Layer already exists
7cbcbac42c44: Layer already exists
e8fa134cb7b8: Layer already exists
17b0972980d8: Pushed
24af4f7c7118: Pushed
6d6a6425aacb: Pushed
333: digest: sha256:dae8cf914ba49928e6f0a34f6740802403813e6d10aa1c1d448a62ce9bb69066 size: 1779

第二个推送命令的输出:

Pushing to google container registry ...
The push refers to a repository [gcr.io/projid/imgname]
24af4f7c7118: Preparing
17b0972980d8: Preparing
6d6a6425aacb: Preparing
809c8c0dd73c: Preparing
e8d45b8ab3ca: Preparing
e8fa134cb7b8: Preparing
7cbcbac42c44: Preparing
e8fa134cb7b8: Waiting
7cbcbac42c44: Waiting
e8d45b8ab3ca: Layer already exists
809c8c0dd73c: Layer already exists
24af4f7c7118: Layer already exists
17b0972980d8: Layer already exists
6d6a6425aacb: Layer already exists
7cbcbac42c44: Layer already exists
e8fa134cb7b8: Layer already exists
latest: digest: sha256:4f57375919829982741d095f8917306fe0c1410e115d030179bae4b8e4299c30 size: 1742

问题:为什么具有两个标签的同一幅图像在 Google 容器注册表中会产生两个不同的图像?

答案1

您当然会推送两个图像标签。我建议先使用单个标签构建,然后添加第二个标签并逐个推送图像标签。如果第二个标签添加了新的摘要,则为 GCR 错误。我遇到过这个错误,并通过删除存储库来解决,以便在下次推送时重新创建它。在我的配置中,Docker 版本也是一个因素。版本 17.04.0-ce、构建 4845c56 将触发额外的摘要,而版本 17.03.1-ce、构建 c6d412e 可以正常工作。

答案2

更新:2021 年 5 月

我没有收到此问题,因此我相信它已得到修复:

Already have image (with digest): gcr.io/cloud-builders/docker
The push refers to repository [gcr.io/proj-dev/client]
1b046f5a4242: Preparing
45ad1ef5106f: Preparing
02c95cff5c48: Preparing
4d5085b7c406: Preparing
516e4ad96ca6: Preparing
94ed6f39e7b4: Preparing
e73bffd94869: Preparing
ebf12965380b: Preparing
94ed6f39e7b4: Waiting
e73bffd94869: Waiting
ebf12965380b: Waiting
516e4ad96ca6: Pushed
4d5085b7c406: Pushed
e73bffd94869: Layer already exists
ebf12965380b: Layer already exists
1b046f5a4242: Pushed
45ad1ef5106f: Pushed
94ed6f39e7b4: Pushed
02c95cff5c48: Pushed
latest: digest: sha256:f824ee7aecb79e1826a311d4dd0d85919a636abc7defc165ec36e8ceb330829c size: 1999
The push refers to repository [gcr.io/proj-dev/client]
1b046f5a4242: Preparing
45ad1ef5106f: Preparing
02c95cff5c48: Preparing
4d5085b7c406: Preparing
516e4ad96ca6: Preparing
94ed6f39e7b4: Preparing
e73bffd94869: Preparing
ebf12965380b: Preparing
94ed6f39e7b4: Waiting
e73bffd94869: Waiting
ebf12965380b: Waiting
1b046f5a4242: Layer already exists
02c95cff5c48: Layer already exists
4d5085b7c406: Layer already exists
45ad1ef5106f: Layer already exists
516e4ad96ca6: Layer already exists
e73bffd94869: Layer already exists
ebf12965380b: Layer already exists
94ed6f39e7b4: Layer already exists
3.0.0-master-7e0d787: digest: sha256:f824ee7aecb79e1826a311d4dd0d85919a636abc7defc165ec36e8ceb330829c size: 1999

答案3

说两张不同的图像是指两个不同的摘要值吗?

SHA 代表安全哈希算法,它是一类加密哈希函数,SHA-256 算法生成几乎唯一的固定大小 256 位(32 字节)哈希。由于图像标签也用于计算摘要,因此即使标签只有一位发生变化,摘要的值也会发生显著变化。在密码学中,这称为雪崩效应,您可以阅读更多相关信息在这里

在此处输入图片描述

答案4

要检查的一件事是比较两个镜像的清单。例如:

docker manifest inspect <image>

或者

skopeo inspect --raw docker://image

如果您在两个应该相同但实际上并不相同的图像之间比较这些命令的 JSON 输出的差异,它可能会让您对潜在的问题有所了解。

例如,就我的情况而言,漏洞在我的图像构建工具(buildah,通过 podman)中,其中两个图像层的媒体类型不正确application/vnd.docker.image.rootfs.diff.tar.gzip,而事实上正确的媒体类型是application/vnd.docker.image.rootfs.diff.tar

此外,当 podman 使用不同的标签推送相同的图像时,它会(有帮助地?)纠正媒体类型,因此容器注册表实际上最终在两个不同的“图像”上使用标签。

相关内容