通过 Digest 查找 Docker Hub 镜像对应的 Tag
在日常使用 Docker 时,我们可能会遇到这样一个场景:本地有一个镜像(比如 n8nio/n8n:latest),但我们想知道这个镜像具体对应 Docker Hub 上的哪个版本 tag。因为 latest 标签只是指向最新的版本,它实际上对应的是一个具体的版本号(如 1.0.0、1.2.3 等)。本文将介绍如何通过镜像的 digest 值来找到对应的 tag。
什么是 Digest?
Docker 镜像的 digest 是镜像内容的 SHA256 哈希值,它是镜像的唯一标识符。每个镜像层和整个镜像都有一个 digest 值。当你拉取一个镜像时,Docker 会计算并验证这个 digest 值来确保镜像的完整性。
获取本地镜像的 Digest
方法一:使用 docker images 命令
1docker images --digests n8nio/n8n
输出示例:
1REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
2n8nio/n8n latest sha256:4a43ddf853afe3ad44be51379e7ed85c16b974cae26cf732d2fcbf71d0cb16c4 3f0c599d2f20 2 months ago 976MB
方法二:使用 docker image inspect 命令
1docker image inspect n8nio/n8n:latest --format '{{json .RepoDigests}}'
输出示例:
1["n8nio/n8n@sha256:4a43ddf853afe3ad44be51379e7ed85c16b974cae26cf732d2fcbf71d0cb16c4"]
在 Docker Hub 上查找对应的 Tag
Docker Hub 提供了 REST API 可以查询仓库的 tags 信息。我们可以通过 API 遍历所有 tags,找到与 digest 匹配的那个。
使用 Python 脚本查询
以下是一个 Python 脚本,可以通过 digest 查找对应的 tag:
filter_digest.py
1import json
2
3import requests
4
5PAGE_SIZE = 100
6URL = "https://hub.docker.com/v2/repositories/{namespace}/{repository}/tags/?page_size={PAGE_SIZE}"
7
8
9def fetch_digests(namespace, repository, digest=None):
10 if not digest:
11 return []
12 url = URL.format(namespace=namespace, repository=repository, PAGE_SIZE=PAGE_SIZE)
13
14 while url:
15 response = requests.get(url)
16 response.raise_for_status()
17 data = response.json()
18
19 for result in data.get("results", []):
20 for image in result.get("images", []):
21 if image.get("digest") == digest:
22 return result
23 if result.get("digest") == digest:
24 return result
25 url = data.get("next")
26
27 return None
28
29
30if __name__ == "__main__":
31 namespace = "n8nio"
32 repository = "n8n"
33 digest = "sha256:4a43ddf853afe3ad44be51379e7ed85c16b974cae26cf732d2fcbf71d0cb16c4"
34 result = fetch_digests(namespace, repository, digest)
35 print(json.dumps(result))
使用方法
- 修改脚本中的
namespace、repository和digest值 - 运行脚本:
python filter_digest.py - 脚本会返回匹配的 tag 信息,包括 tag 名称、创建时间、镜像大小等
输出示例
1{
2 "creator": 6760745,
3 "id": 1008109846,
4 "images": [
5 {
6 "architecture": "amd64",
7 "features": "",
8 "variant": null,
9 "digest": "sha256:aeb609a4ee36f843118496ff82a2f0471027ad1f159d14c9364ee4f0d0dbd9b2",
10 "os": "linux",
11 "os_features": "",
12 "os_version": null,
13 "size": 270889921,
14 "status": "active",
15 "last_pulled": "2026-01-12T09:08:21.390357865Z",
16 "last_pushed": "2025-11-10T13:47:33.102355622Z"
17 },
18 {
19 "architecture": "unknown",
20 "features": "",
21 "variant": null,
22 "digest": "sha256:f97ff58cd8d2cb708b010aa7e912c74bb07b7daa822475cb84e1ef919cb053f9",
23 "os": "unknown",
24 "os_features": "",
25 "os_version": null,
26 "size": 5808118,
27 "status": "active",
28 "last_pulled": "2026-01-12T03:02:58.181134728Z",
29 "last_pushed": "2025-11-10T13:47:33.809553789Z"
30 },
31 {
32 "architecture": "arm64",
33 "features": "",
34 "variant": null,
35 "digest": "sha256:27bc4f914e832d9e9f5cea9c99aa435ddc138d8d53e5fce0b546e87bad1c724d",
36 "os": "linux",
37 "os_features": "",
38 "os_version": null,
39 "size": 268893252,
40 "status": "active",
41 "last_pulled": "2026-01-12T04:59:23.566476676Z",
42 "last_pushed": "2025-11-10T14:15:55.642541647Z"
43 },
44 {
45 "architecture": "unknown",
46 "features": "",
47 "variant": null,
48 "digest": "sha256:fcb488078ed35fb99255c30fd0930240b5771045148aea97eeace65674f7c12c",
49 "os": "unknown",
50 "os_features": "",
51 "os_version": null,
52 "size": 5808259,
53 "status": "active",
54 "last_pulled": "2026-01-09T15:42:03.74659943Z",
55 "last_pushed": "2025-11-10T14:15:56.424887489Z"
56 }
57 ],
58 "last_updated": "2025-11-10T14:19:44.292916Z",
59 "last_updater": 6760745,
60 "last_updater_username": "n8nio",
61 "name": "1.119.1",
62 "repository": 7303950,
63 "full_size": 270889921,
64 "v2": true,
65 "tag_status": "active",
66 "tag_last_pulled": "2026-01-12T09:08:21.390357865Z",
67 "tag_last_pushed": "2025-11-10T14:19:44.292916Z",
68 "media_type": "application/vnd.oci.image.index.v1+json",
69 "content_type": "image",
70 "digest": "sha256:4a43ddf853afe3ad44be51379e7ed85c16b974cae26cf732d2fcbf71d0cb16c4"
71}
使用场景
这个技巧在以下场景中特别有用:
- 版本追踪:当你本地有一个旧版本的镜像,想知道它对应的版本号
- 安全审计:确认本地镜像的具体版本,用于安全漏洞排查
- CI/CD 调试:在构建流程中验证拉取的镜像版本是否正确
- 多架构支持:查找不同架构(如 amd64、arm64)的镜像对应的 tag
总结
通过 digest 查找 Docker Hub 上的 tag 是一个简单但实用的技巧。它可以帮助我们更好地管理 Docker 镜像,特别是在需要精确知道镜像版本信息的场景下。结合 Docker Hub API 和简单的脚本,我们可以轻松实现这个功能。