如何通过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这类参数完全无效。
解决方案
- 更换API端点:使用
https://hub.docker.com/v2/repositories/(移除路径中的library/),该端点返回所有公开仓库,包含用户上传的非官方镜像。 - 修正参数:添加
is_official=false筛选非官方镜像,同时修正原代码中perating_system的拼写错误为operating_system。 - 添加认证(推荐):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
相关产品推荐
相关产品推荐

