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--->运维: 集群 ...
随机推荐
- VirtualBox磁盘扩容
前言 虚拟机开始时设置的磁盘空间比较小,后面使用就不够了. # 查询磁盘使用情况 df -h 虚拟硬盘扩容 关闭正在运行的虚拟机 选中工具栏 选择虚拟硬盘,并选中需要扩容的磁盘 拖动进度条,设置想要扩 ...
- vscode运行js文件
一. 首先你需要下载安装 nodejs 下载地址 二. 在 VS Code中有一个插件 code runner,安装后可以直接运行在 node 环境中,然后就可以在 vscode 中输出文件的结果. ...
- Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge
前言 在拉取远程代码时,出现 Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge ...
- 往EXCEL粘贴超长整数字段
写一个表格的HTML <table border="1"> <tr> <td>1</td> <td>1234567890 ...
- oracle 添加白名单- 重启监听
由于oracle中存在白名单,有新增主机需要访问,添加白名单需要重启监听 1.添加白名单 登陆oracle主机,su - grid 切到grid用户, vi $ORACLE_HOME/network/ ...
- unity 多层叠加的BillBoard特效转序列帧特效降低overdraw
- 关于TCP的握手与挥手
关于TCP的握手与挥手 前言 由于自己每次都是唱的比懂的好听,光知道唱"三次握手四次挥手",再往里细问SYN标志就只能阿巴阿巴阿巴,为了解决自己的知识储备问题,顺便继续深入了解TC ...
- zk源码—7.ZAB协议和数据存储
大纲 1.两阶段提交Two-Phase Commit(2PC) 2.三阶段提交Three-Phase Commit(3PC) 3.ZAB协议算法 4.ZAB协议与Paxos算法 5.zk的数据存储原理 ...
- 为什么 Java 中某些新生代和老年代的垃圾收集器不能组合使用?
为什么 Java 中某些新生代和老年代的垃圾收集器不能组合使用? 在 JVM 中,新生代和老年代的垃圾收集器是分工协作的.然而,并非所有的新生代和老年代垃圾收集器都能任意组合使用,这是由于它们的设计目 ...
- jmeter使用时报错问题
一.打开时命令行提示按任意键继续图形界面无法打开 如图,打开时jmeter命令行报错 根据报错内容,是Java没有安装好. jdk安装好后,需要在环境变量中配置. 但是jdk安装配置好后打开还是报错, ...