将组织仓库导出为 CSV
本指南介绍如何从 Docker Hub 组织中导出所有仓库的完整列表,包括私有仓库。您将使用来自管理员账户的 个人访问令牌 (PAT) 对 Docker Hub API 进行身份验证,并将仓库详细信息导出到 CSV 文件,以便用于报告或分析。
导出的数据包括仓库名称、可见性状态、最后更新时间、拉取次数和星标数。
先决条件
开始前,请确保您具备以下条件:
- 对 Docker Hub 组织的管理员访问权限
- 已安装
curl用于发起 API 请求 - 已安装
jq用于 JSON 解析 - 电子表格应用程序,用于查看 CSV 文件
创建个人访问令牌
从具有该组织仓库访问权限的用户账户 创建个人访问令牌。创建令牌时,至少选择 只读 访问权限以列出仓库。
[!重要]
使用属于该组织成员的用户账户的 PAT。具有所有者角色的用户可以导出所有组织仓库。成员只能导出他们有权访问的仓库。
使用 Docker Hub API 进行身份验证
将您的个人访问令牌交换为 JWT 承载令牌,用于后续的 API 请求。
-
将您的 Docker Hub 用户名、组织名称和个人访问令牌设置为变量:
USERNAME="<your-docker-username>" ORG="<org-name>" PAT="<your_personal_access_token>" -
调用身份验证端点以获取 JWT:
TOKEN=$( curl -s https://hub.docker.com/v2/auth/token \ -H 'Content-Type: application/json' \ -d "{\"identifier\":\"$USERNAME\",\"secret\":\"$PAT\"}" \ | jq -r '.access_token' ) -
验证令牌是否成功获取:
$ echo "Got JWT: ${#TOKEN} chars"
您将在所有后续 API 调用的 Authorization 头部中使用此 JWT 作为承载令牌。
检索所有仓库
Docker Hub API 会对仓库列表进行分页。此脚本会检索所有页面并合并结果。
-
设置页面大小和初始 API 端点:
PAGE_SIZE=100 URL="https://hub.docker.com/v2/namespaces/$ORG/repositories?page_size=$PAGE_SIZE" -
遍历所有结果:
ALL=$( while [ -n "$URL" ] && [ "$URL" != "null" ]; do RESP=$(curl -s "$URL" -H "Authorization: Bearer $TOKEN") echo "$RESP" | jq -c '.results[]' URL=$(echo "$RESP" | jq -r '.next') done | jq -s '.' ) -
验证检索到的仓库数量:
$ echo "$ALL" | jq 'length'
脚本会继续请求每个响应中的 next URL,直到分页完成。
导出为 CSV
生成包含仓库详细信息的 CSV 文件,您可以在电子表格应用程序中打开该文件。
运行以下命令以创建 repos.csv:
echo "$ALL" | jq -r '
(["namespace","name","is_private","last_updated","pull_count","star_count"] | @csv),
(.[] | [
.namespace, .name, .is_private, .last_updated, (.pull_count//0), (.star_count//0)
] | @csv)
' > repos.csv验证导出是否完成:
$ echo "Rows:" $(wc -l < repos.csv)
在您偏好的电子表格应用程序中打开 repos.csv 文件,以查看和分析您的仓库数据。
故障排除
仅显示公共仓库
与您的个人访问令牌关联的 Docker Hub 账户可能无权访问组织中的私有仓库。
要解决此问题:
- 验证该账户是组织的成员
- 检查该账户是否具有适当的权限(所有者或成员角色)
- 确保个人访问令牌具有足够的访问权限
- 重新生成 JWT 并重试导出
API 返回 403 或缺少字段
确保您使用的是来自 /v2/auth/token 端点的 JWT 作为 Authorization 头部中的承载令牌,而不是直接使用个人访问令牌。
验证您的身份验证:
$ curl -s "https://hub.docker.com/v2/namespaces/$ORG/repositories?page_size=1" \
-H "Authorization: Bearer $TOKEN" | jq
如果此操作返回错误,请重新运行身份验证步骤以获取新的 JWT。