You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker Hub API v2获取非官方镜像用于Snyk分析?

解决Docker Hub API获取非官方镜像的问题

我正在开展Docker镜像统计研究,编写了Python脚本从Docker Hub获取镜像用于Snyk测试,但目前仅能获取官方镜像(无错误,缺乏统计价值)。尝试使用Docker Hub API v2的is_official=false和image_filter=unofficial参数后,问题仍未解决,当前代码如下:

url = 'https://hub.docker.com/v2/repositories/library/?page_size=100&perating_system=linux&image_filter=open_source'


results = []

while len(results) < 1000:
    response = requests.get(url)
    json_data = response.json()
    for result in json_data['results']:
        name = result['name']
        results.append(name)
        if len(results) >= 1000:
            break
    if 'next' in json_data and json_data['next']:
        url = json_data['next']
    else:
        break

random_results = random.sample(results, min(len(results), 1000))
print(random_results)

# write results to file
with open('random_images.txt', 'w') as f:
    for image in random_results:
        f.write(image + '\n')

问题根源

你当前请求的API端点是/v2/repositories/library/,其中library是Docker官方镜像的专属命名空间,无论添加什么过滤参数,这里返回的都只有官方镜像,因此is_official=false这类参数完全无效。

解决方案

  1. 更换API端点:使用https://hub.docker.com/v2/repositories/(移除路径中的library/),该端点返回所有公开仓库,包含用户上传的非官方镜像。
  2. 修正参数:添加is_official=false筛选非官方镜像,同时修正原代码中perating_system的拼写错误为operating_system。
  3. 添加认证(推荐):Docker Hub对未认证请求有严格速率限制,添加简单认证可避免被限流,建议使用Docker Hub用户名+个人访问令牌(账户设置中生成)。

修改后的代码

import requests
import random

# 替换为你的Docker Hub用户名和个人访问令牌(或密码)
USERNAME = "your_username"
TOKEN = "your_personal_access_token"

# 调整API端点与过滤参数
url = 'https://hub.docker.com/v2/repositories/?page_size=100&operating_system=linux&is_official=false'

results = []
auth = (USERNAME, TOKEN)

while len(results) < 1000:
    response = requests.get(url, auth=auth)
    # 检查请求状态
    if response.status_code != 200:
        print(f"请求失败,状态码: {response.status_code}")
        print(response.text)
        break
    json_data = response.json()
    for result in json_data['results']:
        # 非官方镜像完整标识为<用户名>/<镜像名>
        full_image_name = result['full_name']
        results.append(full_image_name)
        if len(results) >= 1000:
            break
    if 'next' in json_data and json_data['next']:
        url = json_data['next']
    else:
        print("无更多分页数据")
        break

random_results = random.sample(results, min(len(results), 1000))
print(random_results)

# 写入文件
with open('random_unofficial_images.txt', 'w') as f:
    for image in random_results:
        f.write(image + '\n')

关键改动说明

  • 端点调整:移除library/后,API返回全量公开仓库,包含非官方镜像。
  • 镜像名称:使用full_name字段获取<用户名>/<镜像名>格式的完整标识,符合Snyk测试的镜像命名要求。
  • 认证处理:添加auth参数规避速率限制,确保批量请求稳定执行。

内容的提问来源于stack exchange,提问作者readJohn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:52:47