我在哪里可以找到 docker 镜像的 sha256 代码?
Posted
技术标签:
【中文标题】我在哪里可以找到 docker 镜像的 sha256 代码?【英文标题】:Where can I find the sha256 code of a docker image? 【发布时间】:2015-11-09 20:25:11 【问题描述】:我想使用它们的 sha256 代码提取 CentOS、Tomcat 等的图像,例如
docker pull myimage@sha256:0ecb2ad60
但我找不到可以在任何地方使用的 sha256 代码。
我检查了 DockerHub 存储库中是否有任何关于 sha256 代码的提示,但找不到任何提示。我通过他们的标签下载了图片
docker pull tomcat:7-jre8
并使用docker inspect
检查图像,看看元数据中是否有 sha256 代码,但没有(添加图像的 sha256 代码可能会更改 sha256 代码)。
我是否必须自己计算图像的 sha256 代码并使用它?
【问题讨论】:
我在 dockerhub 上创建了一个与此相关的问题 - github.com/docker/docker/issues/17670 【参考方案1】:最新答案
OhJeez 在 cmets 中建议的编辑。
docker inspect --format='index .RepoDigests 0' $IMAGE
原答案
我相信你也可以使用
docker inspect --format='.RepoDigests' $IMAGE
仅适用于 Docker 1.9 并且图像最初是由摘要提取的。 Details are on the docker issue tracker.
【讨论】:
至少对我来说,这也适用于不是通过摘要提取的图像,而是通过标签。 Docker 18.09.7 就是这样。 Windows下请使用双引号 --format="..." (github.com/docker/toolbox/issues/433#issuecomment-188790050) 看完这篇文章后,可能还想看看下面的帖子。 ***.com/questions/56364643/… 获得 remote sha 真是太好了。您可能还需要下面的另一个答案来获得 local sha。【参考方案2】:您可以通过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
语句中很有用,可以对摘要完成一些工作。【参考方案3】:
最简单最简洁的方法是:
docker images --no-trunc --quiet $IMAGE
这仅返回sha256:...
字符串,不返回任何其他内容。
例如:
$ docker images --no-trunc --quiet debian:stretch-slim
sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248
编辑:
注意:这仅适用于本地图像。如果需要,您可以先docker pull $IMAGE
。
【讨论】:
这是真正的仅限本地。--quiet
打印的校验和并不是真正的摘要,无法从 Docker Hub 中提取,并且与其他答案打印的校验和不同。见github.com/docker/hub-feedback/issues/…。
这个!这是避免工作难题的一个非常重要的部分。使用它来获取您刚刚构建的 LOCAL sha,然后将此 sha 与要推送图像的 REMOTE sha 进行比较(见上文),看看您是否可以完全跳过该操作。太棒了! (其他解决方案在本地不起作用)。【参考方案4】:
刚看到:
当我拉取图像时,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
这个sha码
sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f
之后可以用
拉取图片docker pull tomcat@sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f
这样您就可以确保图像没有被更改并且可以安全地用于生产。
【讨论】:
这并不是一个完整的解决方案,因为它只处理在线图像。如果你想要本地图像的 sha256 怎么办? 还有另一个答案(有更多赞成票)可以让您获得本地 SHA。然后,除此之外,还有更多的赞成票,如何在不下载整个图像的情况下获取远程 SHA。【参考方案5】:除了现有答案之外,您还可以在执行docker images
时使用--digests
选项来获取您拥有的所有图像的摘要列表。
docker images --digests
您可以添加一个 grep 以进一步深入了解
docker images --digests | grep tomcat
【讨论】:
【参考方案6】:我发现上述方法在某些情况下不起作用。他们要么:
不要很好地处理具有相同哈希的多个图像(在 .RepoDigests 建议的情况下 - 当您想要使用特定的注册表路径时) 将图像推送到注册表时效果不佳 (在 .Id 的情况下,它是本地哈希,而不是 注册表)。以下方法很微妙,但适用于提取特定推送容器的特定完整“名称”和哈希。
这是场景 - 一张图片分别上传到同一个 repo 中的 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
【讨论】:
我在 Cloud Deploy 中遇到了与 GCR 图像相同的摘要不一致问题。这正是我所需要的。谢谢。【参考方案7】:这应该是 Id 字段,您可以在旧的 deprecated 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"]
但是:这不是现在与 new docker distribution 的工作方式。 见issue 628: "Get image ID with tag name"
/v1/
注册表响应/repositories/<repo>/tags
用于列出图像 ID 和标签句柄。/v2/
似乎只给出句柄。将 ID 与本地找到的 ID 进行比较会很有用。我唯一能找到 ID 的地方是清单的
v1Compat
部分(这对于我想要的信息来说太过分了)
目前(2015 年中)的答案是:
V1 API 的这一属性对于图像存储在后端的方式而言计算量非常大。仅枚举标记名称以避免二次查找。 此外,V2 API 不处理 Image ID。相反,它使用摘要来识别层,可以将其计算为层的属性并且可以独立验证。
【讨论】:
【参考方案8】:您可以在从相应存储库中提取图像时找到它。下面的命令提到 Digest: sha256 在拉取 docker 镜像时。
09:33 AM##~::>docker --version
Docker version 19.03.4, build 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"
【讨论】:
【参考方案9】:正如@zelphir 所提到的,使用摘要不是一个好方法,因为它不存在于仅本地图像中。我假设图像 ID sha 在标签/拉/推等方面是最准确和一致的。
docker inspect --format='index .Id' $IMAGE
成功了。
【讨论】:
【参考方案10】:只要再次发出docker pull tomcat:7-jre8
,你就会得到你想要的。
【讨论】:
以上是关于我在哪里可以找到 docker 镜像的 sha256 代码?的主要内容,如果未能解决你的问题,请参考以下文章
我在哪里可以在 nativescript android 应用程序中找到 sha1 指纹?
查找 Google Container Registry 公共镜像列表
当我们在 Windows 中使用 docker 镜像和容器时,它存储在哪里?
docker导入镜像报错:invalid diffID for layer xxx: expected “sha256:xxx“, got “sha256:xxx“(文件被更改过)