Python调用Harbor api删除多版本镜像!

这个脚本用于清理Harbor仓库,保留最新版本,回收存储空间。基于Harbor 1.9.0,需修改URL、认证信息和排除项目。遇到问题包括:项目命名不规范导致的tag过滤错误,以及requests库的keep-alive问题导致的清理失败。解决方案包括:删除不必要项目或将其排除,以及关闭requests的Keep_alive并使用Session。
摘要由CSDN通过智能技术生成

本脚本基于Harbor 1.9.0编写,已经编写为类,拿来自己改下就能用!

  • github地址:https://github.com/J-jingwei/harbor-script 或点击 GitHub地址
  • 需要修改部分:
1、url(可通过进入harbor首页左下角api控制中心查看);
2、带管理权限的harbor用户名密码;
3、需要排除的项目组project(无需排除设为空列表即可)。
编写该脚本的初衷:Harbor存储上升很快仓库不久就要满了,需要回收存储,只保留最新几个版本,多余版本删除,回收空间。
如harbor版本不为1.9.0,api本人并未对比api是否一致,可以自行尝试,如api不同自行更改即可。
忘了一点,需要注意得一点是,我们image 版本的tag形式为 x.x.x.20191115152501 (版本+时间),如镜像版本标记不同需要自行修改一下list_tag 中spilit 切分部分

  • 更新日志: 增加traceback便于脚本出错的问题定位,增加requests的Session保持,直接记录auth无需每次提供auth参数,取消requests的Keep_alive,设置最大连接数以及重试次数。

  • 问题记录:

2019.12.30 清理脚本挂在服务器上每晚定时执行清理,但最近发现harbor的容量显著增长了,按理说有清理脚本不至于增长那么迅速,在垃圾回收日志中发现有近一个星期并未执行成功该脚本了,然后逐一排查问题;

第一个问题;
问题描述:发现过滤同一仓库下多个tag时出现报错,发现Harbor仓库中多一个项目,主要原因是tag的命名没有遵循(版本+时间),导致无法split进行时间比对,导致失败。
解决办法:原来是小伙伴做jenkins的镜像新建了一个测试项目,目前也不需要了所以了解后直接果断给该项目删除了,当然我们也可以不删除,在排除列表中加入该项目名,排除即可。

第二个问题;
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='images.xxx.net', port=443): Max retries exceeded with url: /api/repositories/dev-golang/xxx-yyy-zzz-server/tags (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f1a5e214780>: 
Failed to establish a new connection: [Errno -2] Name or service not known',))
问题描述:解决了第一个问题后,又出现一个问题,初步怀疑由于Harbor较长时间未清理,需过滤的操作过多,出现该问题,通过搜索发现requests使用了urllib3库,默认的http connection是keep-alive的,请求过多的保持占用,后续请求无法请求成功
解决办法:将requests中Keep_alive设置False关闭,由于这正好需要引入Seesion,正好一起将此脚本开始就应该解决的问题Session,auth之类一块解决,于是对代码进行了修改。
                                                                  最后更新时间:20190530
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'jiangjw'
'''本脚本适用于清理释放harbor镜像仓库空间;
    此脚本基于harbor 1.9.0版本编写;
    harbor 1.7.0 以后版本可通过页面垃圾回收;
    如不同版本api不同需自行更改各个函数中url部分。'''

import json
import heapq
import requests
from requests.auth import HTTPBasicAuth
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from tqdm import tqdm
from time import sleep, time
import traceback


class Harbor(object):
    def __init__(self, api_url, user, num, exclude):
        """
        初始化一些基本参数
        :param auth: login password authority management
        :param head: change user-agent
        :param url: harbor server api url
        :param project_exclude: Exclude project team
        :param num_limit: Limit the number of retained versions
        :param project_special: project dict id and repo total
        :param project_state: project dict name and id
        :param repo_state: repo dict name and tag total
        :param repo_dispose: Count the number of tag processing
        :param tag_state: tag dict repo_name and tag
        """
        self.auth = user
        self.head = {
   "user_agent": "Mozilla/5.0"}
        self.url = api_url
        self.project_exclude = exclude
        self.num_limit = int(num)
        self.project_special = {
   }
        self.project_state = {
   }
        self.repo_state = {
   }
        self.repo_dispose_count = 0
        self.tag_state = {
   }

    def setting(self):
        self.session = requests.Session()
        self.session.auth = self.auth
        retry = Retry
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用Golang调用Harbor API删除镜像,可以按照以下步骤进行操作: 1. 导入相关的Golang软件包: ```go import ( "bytes" "net/http" ) ``` 2. 构建HTTP请求: ```go func createRequest(method, url string, payload []byte) (*http.Request, error) { req, err := http.NewRequest(method, url, bytes.NewBuffer(payload)) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/json") return req, nil } ``` 3. 发送HTTP请求并获取响应: ```go func sendRequest(req *http.Request) (*http.Response, error) { client := http.DefaultClient resp, err := client.Do(req) if err != nil { return nil, err } return resp, nil } ``` 4. 构建删除镜像的URL: ```go func buildDeleteURL(baseURL, projectName, repoName, tag string) string { return fmt.Sprintf("%s/api/repositories/%s/%s/tags/%s", baseURL, projectName, repoName, tag) } ``` 5. 执行删除镜像的操作: ```go func deleteImage(baseURL, projectName, repoName, tag, username, password string) error { url := buildDeleteURL(baseURL, projectName, repoName, tag) req, err := createRequest("DELETE", url, nil) if err != nil { return err } req.SetBasicAuth(username, password) resp, err := sendRequest(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Failed to delete image. Status code: %d", resp.StatusCode) } return nil } ``` 其中,baseURL是Harbor的URL,projectName是项目名称,repoName是镜像仓库名称,tag是镜像标签,username和password是Harbor API的登录凭证。 通过以上步骤,就可以使用Golang调用Harbor API删除镜像了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值