使用 REST API 查询私有镜像仓库中的镜像 tags
信息,是一种非常直接、灵活的方式。通过简单的 HTTP 请求,可以快速获取到镜像的所有版本信息,并根据需求进行选择。对于企业内部的镜像管理,REST API 提供了一种高效且自动化的解决方案。
为了确保我们使用的镜像版本符合要求,通常需要查询镜像仓库中的可用 tags
信息,用于回退或更新最新版本镜像。
本文将介绍如何通过 Docker Registry API v2 查询私有镜像仓库中的镜像 tags
列表。
前提条件
在开始之前,需要满足以下前提条件:
- Docker Registry 支持 API v2:大多数私有仓库(如 Docker 官方 Registry、Harbor)都支持此版本的 API。
- 仓库需要身份验证:如果仓库启用了身份验证,确保你有正确的用户名和密码。
API 请求格式
如果没有开启https,则改为http
Docker Registry API 提供了一个简单的 GET 请求来查询某个镜像的 tags 列表。请求的基本格式如下:
GET https://<your_private_registry>/v2/<image_name>/tags/list
其中:
- <your_private_registry> 是你的私有镜像仓库地址(例如 your-registry.com)。
- <image_name> 是你要查询的镜像名称(例如 my-app)。
示范
本文使用的镜像版本为ehub.ctcdn.cn/public/centos
,用户名与密码为lolicp.com
,都将以此进行示范。
获取指定镜像的Tags列表
本文使用的镜像仓库添加了密码,需要加-u
通过curl命令获取ehub.ctcdn.cn/public/centos
镜像包含的tags列表:
curl -s -X GET -u 'lolicp.com:lolicp.com' https://ehub.ctcdn.cn/v2/public/centos/tags/list|python -m json.tool
这个命令会返回一个 JSON 对象,列出所有的 tags。
API响应解析
无论是否需要身份验证,成功的请求会返回一个包含镜像 tags
的 JSON 响应。
例如,执行上述请求后,你会得到如下响应:
{
"name": "public/centos",
"tags": [
"7",
"latest"
]
}
解析响应结果
"name"
表示镜像的名称。"tags"
列表中包含了该镜像的所有可用版本,如7
和latest
。
通过这些 tags
,你可以选择具体的版本来拉取镜像或用于部署。
获取每个 Tag 的 Manifest
对于每个 tag,你需要获取它的 Manifest 以提取创建日期或构建时间。你可以使用以下命令:
[root@lolicp ~]# curl -X GET -u 'lolicp.com:lolicp.com' https://ehub.ctcdn.cn/v2/public/centos/manifests/latest
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 2754,
"digest": "sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 76097157,
"digest": "sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc"
}
]
}
演示的镜像仓库无该关键字。
在返回的 JSON 中,如果存在 created
字段。这个字段通常位于 history
数组中某个对象的 v1Compatibility
字段内,表示镜像的创建时间。
提取日期信息*
通过脚本或手动提取每个 tag 对应的日期信息。例如,使用 jq
命令行工具可以更容易地提取数据:
[root@lolicp ~]# curl -s -X GET -u 'lolicp.com:lolicp.com' https://ehub.ctcdn.cn/v2/public/centos/manifests/latest | jq -r '.history[0].v1Compatibility | fromjson | .created'
2022-12-06T14:39:50.077592413Z
你可以将这个命令用于所有 tags 来获取每个 tag 的创建日期。
自动化查询多个Tags创建时间
使用bash脚本查询指定镜像的tags列表,并查询所有tag的创建时间。
#!/bin/bash
# 查询镜像tags创建时间
# Author: lolicp.com
tags=$(curl -s -X GET -u 'lolicp.com:lolicp.com' https://ehub.ctcdn.cn/v2/public/centos/tags/list | jq -r '.tags[]')
for tag in $tags; do
date=$(curl -s -X GET -u 'lolicp.com:lolicp.com' https://ehub.ctcdn.cn/v2/public/centos/manifests/$tag | jq -r '.history[0].v1Compatibility | fromjson | .created')
echo "Tag: $tag - Date: $date"
done
这个脚本会输出每个 tag 及其对应的创建日期。
[root@lolicp ~]# bash check_tags.sh
Tag: pipe-131-commit-b1a0c128 - Date: 2022-10-21T08:31:57.754980606Z
Tag: pipe-132-commit-61b5c72e - Date: 2022-10-21T08:33:15.865349475Z
Tag: pipe-134-commit-c1f0ca2b - Date: 2022-10-21T08:34:25.900578133Z
Tag: pipe-139-commit-5154ce2a - Date: 2022-10-21T09:01:37.884131107Z
Tag: pipe-131-commit-819fc822 - Date: 2022-10-21T10:31:11.18113037Z
Tag: pipe-135-commit-d1bfc928 - Date: 2022-10-21T11:13:55.827228169Z
Tag: pipe-139-commit-7142c324 - Date: 2022-10-21T12:25:16.126039988Z
Tag: pipe-144-commit-0111c222 - Date: 2022-10-22T07:50:46.300171442Z