Python实现Harbor私有镜像仓库垃圾自动化清理详情

Python实现Harbor私有镜像仓库垃圾自动化清理详情

在使用容器时,镜像管理非常重要。一个镜像存在于仓库中,仓库最好具有自动清理功能以避免垃圾堆积。Harbor 是一款私有 Docker 镜像仓库管理软件,它可以实现镜像仓库的自动化清理功能。这里我们将详细讲解如何使用 Python 实现 Harbor 私有镜像仓库垃圾自动化清理。

安装依赖

首先,我们需要安装 Python3 和 Python requests 库。可以使用以下命令进行安装:

sudo apt-get update
sudo apt-get install python3
sudo apt-get install python3-pip
pip3 install requests

生成访问 Token

为了自动化删除 Harbor 中的垃圾镜像,我们需要使用 Harbor 的 API。首先,我们需要生成用于访问 API 的 Token。可以使用以下命令来生成 Token:

curl -u 'username:password' "https://harbor.example.com/service/token?account=admin&client_id=harbor&offline_token=true&service=harbor-registry" -k | jq -r '.token'

其中,usernamepassword 分别修改为你的 Harbor 管理员用户名和密码。harbor.example.com 修改为你的 Harbor 地址。如果没有安装 jq 工具,可以忽略 -r '.token'

程序中需要使用到 Token,可以将其存为环境变量或写入配置文件。

编写自动清理脚本

接下来,我们可以编写 Python 脚本来实现自动清理 Harbor 中的垃圾镜像。详细代码见下:

# -*- coding: utf-8 -*-
import requests
import os
import json
import datetime

harbor_host = "https://harbor.example.com"

headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer %s" % os.getenv("HARBOR_TOKEN")
}

def list_all_repo():
    url = harbor_host + "/api/repositories"
    res = requests.get(url=url, headers=headers, timeout=60, verify=False)
    if res.status_code != 200:
        print("Get repo list failed with HTTP Status: %s" % res.status_code)
        return None
    return json.loads(res.text)

def list_all_tags(repo):
    url = "%s/api/repositories/%s/tags" % (harbor_host, repo)
    res = requests.get(url=url, headers=headers, timeout=60, verify=False)
    if res.status_code != 200:
        print("Get tag list failed with HTTP Status: %s" % res.status_code)
        return None
    return json.loads(res.text)

def delete_tag(repo, tag):
    url = "%s/api/repositories/%s/tags/%s" % (harbor_host, repo, tag)
    res = requests.delete(url=url, headers=headers, timeout=60, verify=False)
    if res.status_code != 200:
        print("Delete tag %s failed with HTTP Status: %s" % (tag, res.status_code))
        return False
    return True

if __name__ == '__main__':
    repo_list = list_all_repo()
    for repo in repo_list:
        print("Cleaning repo: %s" % repo.get("name"))
        tags = list_all_tags(repo.get("name"))
        if tags:
            for tag in tags:
                timestamp = int(tag.get("created", "0"))
                if timestamp:
                    created_time = datetime.datetime.fromtimestamp(timestamp)
                    days = (datetime.datetime.now() - created_time).days
                    if days >= 30:
                        print("Deleting tag: %s, created: %s, age: %s days" % (tag.get("name"), created_time.strftime("%Y/%m/%d"), days))
                        delete_tag(repo.get("name"), tag.get("name"))

上述代码中,我们编写了三个函数:

  • list_all_repo:获取 Harbor 中所有仓库的列表。
  • list_all_tags:获取指定仓库的所有镜像标记列表。
  • delete_tag:删除指定仓库中指定镜像标记。

if __name__ == '__main__' 分支中,我们首先获取所有仓库的列表,然后遍历每个仓库的所有镜像标记。对于每个镜像标记,我们计算它的创建时间,如果它的年龄超过 30 天,则删除它。

示例应用

以下是对上述代码的两个示例应用:

示例1:使用 cron 任务定期清理

cron 是一个用于在 Linux 上设置定期任务的工具。我们可以使用如下命令设置一个每天清理一次垃圾镜像的定期任务:

crontab -e
0 0 * * * /usr/bin/python3 /path/to/cleanup.py

以上命令表示在每天午夜(0点)执行 /path/to/cleanup.py 脚本。

示例2:手动清理所有仓库

如果您想手动清理所有仓库的所有镜像标记:

python3 cleanup.py

执行结束后,所有年龄超过 30 天的镜像标记将被删除。

总结

使用 Python 实现 Harbor 私有镜像仓库垃圾自动化清理并不难。通过编写简单的脚本,我们可以轻松地清理过期的镜像标记,避免仓库内的垃圾堆积。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现Harbor私有镜像仓库垃圾自动化清理详情 - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • Python内建属性getattribute拦截器使用详解

    Python内建属性getattribute拦截器使用详解 在Python中,__getattribute__方法是一个能够拦截对象属性访问的强大工具。在本文中,我们将介绍该方法的详细用法和示例。 什么是__getattribute__方法? __getattribute__方法是Python的一个内置方法,它在对象属性被访问时被调用。这个方法允许你拦截对于…

    python 2023年6月6日
    00
  • 关于准备/展示 Python 大师班的建议?

    【问题标题】:Advice on preparing/presenting a Python Master Class?关于准备/展示 Python 大师班的建议? 【发布时间】:2023-04-02 01:26:01 【问题描述】: 我正在准备一个大师班,向工作中的一群技术艺术家#展示。小组中的每个人都曾使用 C/C++/MEL/MAXScript/Pyt…

    Python开发 2023年4月8日
    00
  • python 如何获取元素在array中的下标

    获取元素在array中的下标,通常可以通过Python内置模块numpy和list自带的方法来实现。 一、使用numpy模块 numpy.where()方法 numpy.where(condition, [x, y]) 该方法返回满足条件的元素下标。 示例: import numpy as np arr = np.array([1, 2, 3, 4, 5])…

    python 2023年6月5日
    00
  • python如何爬取网页中的文字

    如何使用Python爬取网页中的文字 使用Python爬取网页中的文字需要以下步骤: 导入相关的模块 确定需要爬取的url,并通过requests模块获取相应的网页内容 使用BeautifulSoup模块处理网页内容 将网页内容中的文字提取出来 以下是更详细的解释: 导入相关的模块 在Python中,需要使用到以下三个模块: import requests …

    python 2023年5月14日
    00
  • Python如何import文件夹下的文件(实现方法)

    使用Python import文件夹下的文件可以帮助我们更好地组织代码,避免代码结构混乱,同时也可以方便地调用函数和变量。下面是实现此功能的攻略: 将要导入的文件放入一个同名文件夹中,例如我们创建了一个名为”utils”的文件夹,并将我们要导入的函数放置其中。 在主文件中使用 import 语句来导入所需的函数。我们可以使用以下两种导入方式: 方式一:导入整…

    python 2023年6月5日
    00
  • Python实现蚁群算法

    下面是关于“Python实现蚁群算法”的完整攻略。 1. 蚁群算法简介 蚁群算法是一种基于蚂蚁觅食行为的启发式优化算法。蚁群算法通过蚂蚁在寻找食物时的行为,来寻找最优解。蚁群算法适用求解组合优化问题,如旅商问题车辆路径问题等。 2. Python实现蚁群算法 在Python中,我们可以使用 numpy 和 matplotlib 等库实现蚁算法。下面是一个使用…

    python 2023年5月13日
    00
  • python保留小数位的三种实现方法

    当我们使用Python编程时,经常需要对数字进行精确的精度处理,包括保留小数位数,下面给出三种Python保留小数位的实现方法。 方法一:使用round函数 round函数是Python内置的用于数值四舍五入操作的函数,可以实现保留小数位的功能。对于任意一个数值a,使用round(a,n)函数可以保留a的小数点后n位。例如,对于数字1.23456789使用r…

    python 2023年6月5日
    00
  • 解读sqlalchemy的常用数据类型有哪些

    当使用SQLAlchemy进行数据存储时,我们需要使用合适的数据类型来存储数据。以下是SQLAlchemy的一些常用数据类型的解释和示例说明。 字符串类型(String) 用于存储文本类型的数据(如名称、描述等)。SQLAlchemy使用String数据类型来表示VARCHAR列类型。 from sqlalchemy import Column, Strin…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部