通过 Digest 查找 Docker Hub 镜像对应的 Tag

在日常使用 Docker 时,我们可能会遇到这样一个场景:本地有一个镜像(比如 n8nio/n8n:latest),但我们想知道这个镜像具体对应 Docker Hub 上的哪个版本 tag。因为 latest 标签只是指向最新的版本,它实际上对应的是一个具体的版本号(如 1.0.01.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))

使用方法

  1. 修改脚本中的 namespacerepositorydigest
  2. 运行脚本:python filter_digest.py
  3. 脚本会返回匹配的 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}

使用场景

这个技巧在以下场景中特别有用:

  1. 版本追踪:当你本地有一个旧版本的镜像,想知道它对应的版本号
  2. 安全审计:确认本地镜像的具体版本,用于安全漏洞排查
  3. CI/CD 调试:在构建流程中验证拉取的镜像版本是否正确
  4. 多架构支持:查找不同架构(如 amd64、arm64)的镜像对应的 tag

总结

通过 digest 查找 Docker Hub 上的 tag 是一个简单但实用的技巧。它可以帮助我们更好地管理 Docker 镜像,特别是在需要精确知道镜像版本信息的场景下。结合 Docker Hub API 和简单的脚本,我们可以轻松实现这个功能。