harbor镜像仓库拉取所有镜像的信息(镜像版本,tag,大小,最后拉取时间)
# -*- coding: utf-8 -*-
# author: yuhaohao
import requests
from requests.auth import HTTPBasicAuth
from openpyxl import Workbook
from datetime import datetime
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Harbor服务器信息
HARBOR_URL = "https://registry.test.com"
USERNAME = "test"
PASSWORD = "1345566"
PROJECT_NAME = "test"
# 关闭SSL验证(如果是自签名证书)
VERIFY_SSL = False
def get_all_repositories():
repos = []
page = 1
while True:
url = f"{HARBOR_URL}/api/v2.0/projects/{PROJECT_NAME}/repositories?page={page}&page_size=100"
response = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD), verify=VERIFY_SSL)
response.raise_for_status()
data = response.json()
if not data:
break
repos.extend(data)
page += 1
return repos
def get_all_artifacts(repository_name):
artifacts = []
page = 1
while True:
url = f"{HARBOR_URL}/api/v2.0/projects/{PROJECT_NAME}/repositories/{repository_name}/artifacts?page={page}&page_size=100"
response = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD), verify=VERIFY_SSL)
response.raise_for_status()
data = response.json()
if not data:
break
artifacts.extend(data)
page += 1
return artifacts
def format_pull_time(pull_time_str):
if not pull_time_str:
return ''
try:
dt = datetime.fromisoformat(pull_time_str.replace('Z', '+00:00'))
return dt.strftime("%Y-%m-%d %H:%M:%S")
except Exception:
return ''
def main():
repositories = get_all_repositories()
all_data = []
for repo in repositories:
full_repo_name = repo['name'] # project_name/repo_name
repo_name_only = full_repo_name.split('/')[1] # 仓库名
artifacts = get_all_artifacts(repo_name_only)
for artifact in artifacts:
size_bytes = artifact.get('size', 0)
size_gb = size_bytes / (1024 * 1024 * 1024)
last_pull_time = artifact.get('pull_time', '')
formatted_pull_time = format_pull_time(last_pull_time)
tags = artifact.get('tags', [])
if tags:
for tag in tags:
all_data.append({
'镜像名称': full_repo_name,
'镜像标签': tag['name'],
'镜像大小(GB)': round(size_gb, 2),
'最后拉取时间': formatted_pull_time
})
else:
all_data.append({
'镜像名称': full_repo_name,
'镜像标签': '',
'镜像大小(GB)': round(size_gb, 2),
'最后拉取时间': formatted_pull_time
})
# 根据 镜像名称 排序,保证同名镜像连在一起
all_data.sort(key=lambda x: x['镜像名称'])
# 写入Excel
wb = Workbook()
ws = wb.active
ws.title = "Harbor镜像信息"
# 写表头
headers = ['镜像名称', '镜像标签', '镜像大小(GB)', '最后拉取时间']
ws.append(headers)
# 写数据
for item in all_data:
ws.append([
item['镜像名称'],
item['镜像标签'],
item['镜像大小(GB)'],
item['最后拉取时间']
])
# 保存文件
excel_file = "harbor镜像信息.xlsx"
wb.save(excel_file)
print(f" 导出完成,文件保存为:{excel_file}")
if __name__ == "__main__":
main()
harbor镜像仓库拉取所有镜像的信息(镜像版本,tag,大小,最后拉取时间)的更多相关文章
- 搭建docker镜像仓库(一):使用registry搭建本地镜像仓库
目录 一.系统环境 二.前言 三.使用registry搭建私有镜像仓库 3.1 环境介绍 3.2 k8smaster节点配置镜像仓库 3.3 k8sworker1节点配置从私有仓库上传和拉取镜像 3. ...
- Kubernetes从私有镜像仓库中拉取镜像
当我们尝试从私有仓库中拉取镜像时,可能会收到这样提示:requested access to the resource is denied Error response from daemon: pu ...
- 005-docker-镜像使用、拉取、运行、创建、打tag
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载. 1.列出所有本地镜像 docker images ...
- xpath拉取链家二手房信息并保存到excel中
import os.path import requests from lxml import etree import xlwt import xlrd def create_excel(): if ...
- Docker学习笔记之从镜像仓库获得镜像
0x00 概述 之前我们说到了,Docker 与其他虚拟化软件的一处不同就是将镜像管理纳入到了功能之中.实现虚拟化只是程序能够无缝移植的一部分,而有了镜像管理,就真正取代了我们在移植过程中的繁琐操作. ...
- 配置 Containerd 在 harbor 私有仓库拉取镜像
官方文档地址:https://github.com/containerd/cri/blob/master/docs/registry.md 严格来说,这个具体可分为两部分 1.在k8s中使用Conta ...
- CentOS7下 让Docker pull命令使用squid做http代理拉取目标镜像仓库的镜像
场景,如下图所示: 服务器B具有两个网卡,分别和服务器A和服务器C互通,这里想要在服务器C上借助服务器B作为桥梁,拉取镜像仓库服务器A上的镜像. 思路也很简单,在服务器上搭建HTTP代理服务,服务器C ...
- Kunbernetes从私有仓库nexus拉取镜像
1.docker登陆认证 [root@master ~]# vim /etc/docker/daemon.json { "insecure-registries": [" ...
- 搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库
目录 一.系统环境 二.前言 三.Harbor 四.使用harbor搭建私有镜像仓库 4.1 环境介绍 4.2 k8smaster节点安装配置harbor 4.2.1 安装harbor离线包 4.2. ...
- Docker详细介绍安装与镜像制作和拉取
一.Docker是什么? 产生背景: 开发和运维之间因为环境不同和导致的矛盾(不同的操作系统.软件环境.应用配置等)DevOps 代码.系统.环境.配置等封装成镜像Image--->运维: 集群 ...
随机推荐
- Windows 提权-服务_未引用的服务路径
本文通过 Google 翻译 Unquoted Service Paths – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- Dubbo学习系列之十九(Apollo分布式部署)
说一个人是武林高手:十八般武艺,样样精通!如今,后端技术层出不穷,让人眼花缭乱,如果看官不能达到样样精通,至少 拿起方天画戟能耍几下才行,比如削个苹果.言归正传,配置中心属于基础设施,当然必须玩得溜, ...
- Golang HTTPS
用golang来实现的webserver通常是是这样的 //main.go package main import ( "fmt" "io" "net ...
- 《机器人SLAM导航核心技术与实战》第1季:第3章_OpenCV图像处理
<机器人SLAM导航核心技术与实战>第1季:第3章_OpenCV图像处理 视频讲解 [第1季]3.第3章_OpenCV图像处理-视频讲解 [第1季]3.1.第3章_OpenCV图像处理_认 ...
- Model Context Protocol
MCP is an open protocol that enables AI models to securely interact with local and remote resources ...
- JMeter提取多个变量值总结
- 记一次 .NET某固高运动卡测试 卡慢分析
一:背景 1. 讲故事 年前有位朋友找到我,说他们的程序会偶发性卡慢 10s 钟,在某些组合下会正常,某些组合下就会出现问题,解释不了其中的原因,让我帮忙看下怎么回事?截图如下: private vo ...
- kettle介绍-Step之CSV Input
CSV Input/CSV 文件输入介绍 CSV 文件输入步骤主要用于将 CSV 格式的文本文件按照一定的格式输入至 流中 Step name:步骤的名称,在单一转换中,名称必须唯一 Filename ...
- MySQL之profiling性能优化
如果需要优化一条SQL,想了解一条sql的每个阶段的耗时分布,则可以使用profiling来进行分析,能很方便的定位在哪个阶段.什么资源引起的性能问题. 一.开启profiling参数 此参数默认是关 ...
- coreJava笔记——1
一.数组 对于数组的操作: 1.System.arrayopy(旧数组,下表,新数组,下表,长度) 2.新对象 = Arrays.copyOf(旧数组,长度): \如果要删除数组中的一个元素,先用1. ...