当前位置: 首页 > news >正文

python自动测试 crictl 可以从哪些国内镜像源成功拉取镜像

自动测试多个国内主流镜像源,并报告哪些可用。

Python 检测脚本

#!/usr/bin/env python3
"""
crictl_mirror_tester.py
功能:自动测试 crictl 可以从哪些国内镜像源成功拉取镜像。
使用方法:节点上运行 python3 crictl_mirror_tester.py
"""import subprocess
import time
import json
from concurrent.futures import ThreadPoolExecutor, as_completedclass CrictlMirrorTester:def __init__(self):self.test_image = "nginx:alpine"  # 用于测试的镜像self.timeout = 120  # 单个镜像拉取超时时间(秒)self.results = []# 国内主流镜像源列表self.mirrors = [{"name": "阿里云","url": "registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine","status": "待测试","time": 0,"output": ""},{"name": "华为云","url": "swr.cn-east-2.myhuaweicloud.com/library/nginx:alpine", "status": "待测试","time": 0,"output": ""},{"name": "腾讯云","url": "ccr.ccs.tencentyun.com/library/nginx:alpine","status": "待测试", "time": 0,"output": ""},{"name": "网易云","url": "hub-mirror.c.163.com/library/nginx:latest","status": "待测试","time": 0,"output": ""},{"name": "Docker官方源(直接)","url": "nginx:alpine","status": "待测试","time": 0,"output": ""},{"name": "中科大镜像","url": "docker.mirrors.ustc.edu.cn/library/nginx:alpine","status": "待测试","time": 0,"output": ""}]def test_single_mirror(self, mirror):"""测试单个镜像源"""print(f"正在测试 {mirror['name']} ({mirror['url']})...")start_time = time.time()try:# 执行 crictl pull 命令cmd = ["sudo", "crictl", "pull", mirror["url"]]result = subprocess.run(cmd, capture_output=True, text=True, timeout=self.timeout)end_time = time.time()mirror["time"] = round(end_time - start_time, 2)mirror["output"] = result.stderr if result.stderr else result.stdoutif result.returncode == 0:mirror["status"] = "✅ 成功"print(f"  {mirror['name']}: ✅ 成功 ({mirror['time']}s)")else:mirror["status"] = "❌ 失败"print(f"  {mirror['name']}: ❌ 失败")except subprocess.TimeoutExpired:end_time = time.time()mirror["time"] = round(end_time - start_time, 2)mirror["status"] = "⏰ 超时"mirror["output"] = f"拉取操作超时({self.timeout}秒)"print(f"  {mirror['name']}: ⏰ 超时")except Exception as e:end_time = time.time()mirror["time"] = round(end_time - start_time, 2)mirror["status"] = "⚠️ 异常"mirror["output"] = str(e)print(f"  {mirror['name']}: ⚠️ 异常")return mirrordef run_tests(self):"""运行所有测试"""print("=" * 60)print("开始测试 crictl 镜像源可用性")print("=" * 60)print(f"测试镜像: {self.test_image}")print(f"超时时间: {self.timeout}秒")print("=" * 60)# 使用线程池并行测试(最多3个并发)with ThreadPoolExecutor(max_workers=3) as executor:future_to_mirror = {executor.submit(self.test_single_mirror, mirror): mirror for mirror in self.mirrors}for future in as_completed(future_to_mirror):try:result = future.result()self.results.append(result)except Exception as e:print(f"测试过程中发生错误: {e}")def generate_report(self):"""生成测试报告"""print("\n" + "=" * 60)print("测试报告")print("=" * 60)# 按成功率排序:成功 -> 失败 -> 超时 -> 异常success_first = sorted(self.results, key=lambda x: (0 if "成功" in x["status"] else 1 if "失败" in x["status"] else2 if "超时" in x["status"] else 3))for mirror in success_first:color = "32m" if "成功" in mirror["status"] else "31m"print(f"{mirror['status']} - {mirror['name']} - {mirror['time']}s")print(f"  镜像地址: {mirror['url']}")if mirror['output'] and "成功" not in mirror['status']:print(f"  错误信息: {mirror['output'][:100]}...")print()# 统计结果successful = [m for m in self.results if "成功" in m["status"]]failed = [m for m in self.results if "失败" in m["status"]]timeout = [m for m in self.results if "超时" in m["status"]]error = [m for m in self.results if "异常" in m["status"]]print("=" * 60)print(f"测试完成!")print(f"✅ 成功的源: {len(successful)} 个")print(f"❌ 失败的源: {len(failed)} 个") print(f"⏰ 超时的源: {len(timeout)} 个")print(f"⚠️ 异常的源: {len(error)} 个")print("=" * 60)# 推荐最佳镜像源if successful:# 选择耗时最短的成功源best_mirror = min(successful, key=lambda x: x["time"])print(f"🎯 推荐使用: {best_mirror['name']}")print(f"   镜像地址: {best_mirror['url']}")print(f"   拉取时间: {best_mirror['time']} 秒")else:print("❌ 没有可用的镜像源,请检查网络连接或节点配置")print("=" * 60)return self.resultsdef cleanup(self):"""清理测试生成的镜像"""print("\n正在清理测试镜像...")for mirror in self.results:if "成功" in mirror["status"]:try:cmd = ["sudo", "crictl", "rmi", mirror["url"]]subprocess.run(cmd, capture_output=True, timeout=30)except:passprint("清理完成!")def main():"""主函数"""try:tester = CrictlMirrorTester()tester.run_tests()results = tester.generate_report()tester.cleanup()# 返回退出码:如果有成功的源返回0,否则返回1successful = any("成功" in m["status"] for m in results)exit(0 if successful else 1)except KeyboardInterrupt:print("\n用户中断测试")exit(1)except Exception as e:print(f"程序执行错误: {e}")exit(1)if __name__ == "__main__":main()

使用方法

  1. 将脚本保存到节点上

    vim crictl_mirror_tester.py
    

    复制上面的代码并保存。

  2. 给予执行权限

    chmod +x crictl_mirror_tester.py
    
  3. 运行测试

    python3 crictl_mirror_tester.py
    

    或者

    ./crictl_mirror_tester.py
    

脚本特点

  1. 并发测试:使用线程池并行测试多个镜像源,大大缩短测试时间
  2. 超时控制:单个镜像拉取超时自动终止,避免长时间等待
  3. 详细报告:彩色输出,清晰显示每个源的测试结果和耗时
  4. 自动清理:测试完成后自动删除下载的镜像,节省磁盘空间
  5. 智能推荐:自动推荐拉取速度最快的可用镜像源
  6. 错误处理:完善的异常处理,确保程序稳定运行

预期输出示例

============================================================
开始测试 crictl 镜像源可用性
============================================================
测试镜像: nginx:alpine
超时时间: 120秒
============================================================
正在测试 阿里云 (registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine)...阿里云: ✅ 成功 (12.34s)
正在测试 华为云 (swr.cn-east-2.myhuaweicloud.com/library/nginx:alpine)...华为云: ✅ 成功 (8.21s)
...============================================================
测试报告
============================================================
✅ 成功 - 华为云 - 8.21s镜像地址: swr.cn-east-2.myhuaweicloud.com/library/nginx:alpine✅ 成功 - 阿里云 - 12.34s  镜像地址: registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine❌ 失败 - 腾讯云 - 15.67s镜像地址: ccr.ccs.tencentyun.com/library/nginx:alpine错误信息: failed to pull image: rpc error: code = Unknown desc = failed to pull...============================================================
测试完成!
✅ 成功的源: 2 个
❌ 失败的源: 1 个
⏰ 超时的源: 0 个
⚠️ 异常的源: 0 个
============================================================
🎯 推荐使用: 华为云镜像地址: swr.cn-east-2.myhuaweicloud.com/library/nginx:alpine  拉取时间: 8.21 秒
============================================================

脚本可以帮你快速找出哪个国内镜像源最快最稳定!

http://www.dtcms.com/a/352289.html

相关文章:

  • pulsar、rocketmq常用命令
  • C#由Dictionary不正确释放造成的内存泄漏问题与GC代系
  • Text to Speech技术详解与实战:GPT-4o Mini TTS API应用指南
  • 从“脚本语言”到“企业级引擎”——PHP 在 2025 年技术栈中的再定位
  • Linux服务器安全配置与NTP时间同步
  • 记录一下,qt问题:qt ui文件的改动无法更新到cpp
  • 疯狂星期四文案网第51天运营日记
  • Typescript入门-interface讲解
  • 类型签名,位置参数,关键字参数
  • open webui源码分析8—管道
  • 域名常见问题集(十一)——为什么要进行域名管理?
  • 【实时Linux实战系列】基于实时Linux的音频实时监控系统
  • 从16个粉丝到680万年收入:AI创业的117天奇迹
  • 声明式微服务通信新范式:OpenFeign如何简化RestTemplate调用
  • Windows下实现类似`watch nvidia-smi`的实时监控效果
  • 进入docker中mysql容器的方法
  • Java:TreeSet的使用
  • (Arxiv-2024)VideoMaker:零样本定制化视频生成,依托于视频扩散模型的内在力量
  • QT qml(quick3D)模型的移动
  • 专业解读《Light》封面:可调谐混合超表面(THCMs)如何革新下一代LiDAR系统
  • 3D游戏角色建模资源搜索指南(资料来源于网络)
  • 湖仓一体:小米集团基于 Apache Doris + Apache Paimon 实现 6 倍性能飞跃
  • JavaWeb之分布式事务规范
  • LInux(二十一)——Linux SSH 基于密钥交换的自动登录原理简介及配置说明
  • jenkins2025配置邮箱发送
  • 基于Android的车位预售预租APP/基于Android的车位租赁系统APP/基于Android的车位管理系统APP
  • Leetcode—1163. 按字典序排在最后的子串【困难】
  • Linux(二十二)——服务器初始化指南
  • cuda编程笔记(16)--使用 cuDNN 实现卷积、激活、池化等反向操作
  • 刀客doc:沃尔玛取消与TTD的独家合作,对程序化广告意味着什么?