在哪里可以找到码头工人镜像的sha256代码?


90

我想使用它们的sha256代码提取centos,tomcat等图像,例如

docker pull myimage@sha256:0ecb2ad60

但是我找不到在任何地方都可以使用的sha256代码。

我在dockerhub存储库中检查了sha256代码的任何提示,但是找不到任何提示。我按标签下载了图像

docker pull tomcat:7-jre8

并使用docker inspect来检查图像,以查看元数据中是否有sha256代码,但是没有(添加图像的sha256代码可能会更改sha256代码)。

我是否必须自己计算图像的sha256代码并使用它?


1
我在dockerhub上创建了与此相关的问题-github.com/docker/docker/issues/17670
Michael Barton,

Answers:


88

最新答案

编辑OhJeez在评论中建议的内容。

docker inspect --format='{{index .RepoDigests 0}}' $IMAGE

原始答案

我相信您也可以使用

docker inspect --format='{{.RepoDigests}}' $IMAGE

仅在Docker 1.9且镜像最初由摘要提取时才有效。详细信息在docker问题跟踪器上。


7
docker inspect --format='{{index .RepoDigests 0}}' $IMAGE用于不使用大括号(返回数组的第一个索引)
OhJeez

@OhJeez,谢谢你,我已经用你的建议更新了我的答案。
迈克尔·巴顿

至少对我来说,这也适用于不是通过摘要而是通过标签提取的图像。这就是Docker 18.09.7。
sleske

在Windows下,请用双引号--format = “...”(github.com/docker/toolbox/issues/433#issuecomment-188790050
大卫

81

你可以得到它 docker images --digests

REPOSITORY          TAG    DIGEST                                                                    IMAGE ID     CREATED        SIZE
docker/ucp-agent    2.1.0  sha256:a428de44a9059f31a59237a5881c2d2cffa93757d99026156e4ea544577ab7f3   583407a61900 3 weeks ago    22.3 MB

要仅获取摘要,还可以使用docker images --format '{{.Digest}}'。这在foreach声明中有助于完成摘要的工作很有用。
Mark Loyman

19

刚刚看到:

当我拉图像时,在输出的底部将显示sha256代码(摘要:sha ....):

docker pull tomcat:7-jre8
7-jre8: Pulling from library/tomcat
902b87aaaec9: Already exists 
9a61b6b1315e: Already exists 
...   
4dcef5c50d60: Already exists 
Digest: sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f
Status: Image is up to date for tomcat:7-jre8

此密码

sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

可以用于随后拉动图像

码头工人拉tomcat @ sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

这样,您可以确保图像不会更改并且可以安全地用于生产。


10
这并不是真正的完整解决方案,因为它仅在线处理图像。如果要本地图像的sha256怎么办?
Zelphir Kaltstahl,

19

最简单,最简洁的方法是:

docker images --no-trunc --quiet $IMAGE

这仅返回sha256:...字符串,而没有其他返回。

例如:

$ docker images --no-trunc --quiet debian:stretch-slim
sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248

编辑:

注意:这仅适用于本地图像。docker pull $IMAGE如果需要,您可以先。


7

除了现有答案之外,您可以--digests在执行操作时使用该选项docker images以获取所有图像的摘要列表。

docker images --digests

您可以添加一个grep来进一步向下钻取

docker images --digests | grep tomcat

5

这应该是Id字段,您可以在旧的已弃用的 Docker Hub API中看到

GET /v1/repositories/foo/bar/images HTTP/1.1
  Host: index.docker.io
  Accept: application/json

Parameters:

namespace – the namespace for the repo
repo_name – the name for the repo

示例响应:

HTTP/1.1 200
Vary: Accept
Content-Type: application/json

[{"id": "9e89cc6f0bc3c38722009fe6857087b486531f9a779a0c17e3ed29dae8f12c4f",
"checksum": "b486531f9a779a0c17e3ed29dae8f12c4f9e89cc6f0bc3c38722009fe6857087"},
{"id": "ertwetewtwe38722009fe6857087b486531f9a779a0c1dfddgfgsdgdsgds",
"checksum": "34t23f23fc17e3ed29dae8f12c4f9e89cc6f0bsdfgfsdgdsgdsgerwgew"}]

但是:这与新的docker发行版现在不一样。 请参见问题628:“使用标签名称获取图像ID”

/v1/注册表的响应/repositories/<repo>/tags用于与标签手柄一起列出图像ID。
/v2/似乎只能给柄。

获取ID与在本地找到的ID进行比较将很有用。我唯一可以找到ID的地方是v1Compat清单的部分(这对我想要的信息来说是过大了)

当前(2015年中)的答案是:

对于将图像存储在后端的方式,V1 API的此属性在计算上非常昂贵。仅枚举标签名称,以避免二次查找。
另外,V2 API不处理图像ID。相反,它使用摘要来标识层,可以将其计算为层的属性并且可以独立验证。


4

我发现上述方法在某些情况下不起作用。他们要么:

  • 不能很好地处理具有相同哈希值的多个图像(对于.RepoDigests建议-当您要使用特定的注册表路径时)
  • 将映像推送到注册表时效果不佳(对于.Id,它是本地哈希,而不是注册表中的哈希)。

下面的方法很精致,但是可以为特定的推送容器提取特定的完整“名称”和哈希值。

这是场景-图像分别上传到同一仓库中的2个不同项目中,因此查询RepoDigests将返回2个结果。

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest

[gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed gcr.io/beta/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed]

我想使用alpha结果,但是我无法预测它将是哪个索引。因此,我需要操纵文本输出以删除方括号,并将每个条目放在单独的行上。从那里我可以轻松地grep结果。

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest | sed 's:^.\(.*\).$:\1:' | tr " " "\n" | grep alpha

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 

3

正如@zelphir所提到的,使用摘要不是一个好方法,因为对于仅本地图像而言,不存在摘要。我假设图像ID sha在标签/拉动/推动等方面是最准确和一致的。

docker inspect --format='{{index .Id}}' $IMAGE

绝招。


2

您可以在从相应存储库中提取映像时找到它。Bellow命令在提取docker映像时提到了Digest:sha256。

09:33 AM ##〜::> docker --version Docker版本19.03.4,内部版本9013bf5

摘要:sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d

09:28 AM##~::>docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
**Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d**
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

图像下载完成后,我们可以执行以下操作

“ ubuntu @ sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d”

09:36 AM##~::>docker inspect ubuntu | grep -i sha256
        "Id": "sha256:775349758637aff77bf85e2ff0597e86e3e859183ef0baba8b3e8fc8d3cba51c",
            **"ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"**
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
                "sha256:cc967c529ced563b7746b663d98248bc571afdb3c012019d7f54d6c092793b8b",
                "sha256:2c6ac8e5063e35e91ab79dfb7330c6154b82f3a7e4724fb1b4475c0a95dfdd33",
                "sha256:6c01b5a53aac53c66f02ea711295c7586061cbe083b110d54dafbeb6cf7636bf",
                "sha256:e0b3afb09dc386786d49d6443bdfb20bc74d77dcf68e152db7e5bb36b1cca638"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.