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字典和列表性能之间的比较

    Python中的字典和列表是常用的数据结构之一,两者在使用场景、功能和性能上有很大的区别。本文将详细讲解Python字典和列表性能之间的比较,为读者提供完整的攻略。 一、Python字典与列表的定义 1.1 Python字典的定义 Python字典是一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对…

    python 2023年5月13日
    00
  • python批量导出导入MySQL用户的方法

    下面我将为您详细讲解 python 批量导出、导入 MySQL 用户的方法的完整攻略。 准备工作 在正式开始之前,我们需要进行一些准备工作。 安装必要的库 首先,我们需要安装 mysql-connector-python 库来连接 MySQL 数据库。可以通过以下命令来安装: pip install mysql-connector-python 创建数据库和…

    python 2023年6月3日
    00
  • 你应该知道的python列表去重方法

    你应该知道的Python列表去重方法 在Python中,列表是一种常用的数据类型,它允许存储多个元素,并可以动态地添加、删除和元素。在实际开发中,经常需要对列表进行去重操作,以便更好地处理数据。本攻略将详细介绍Python中常用的列表去重方法,包括使用set()函数、使用列表导式、使用循环等方法。 使用set()函数 在Python中,可以使用set()函数…

    python 2023年5月13日
    00
  • Python 抓取动态网页内容方案详解

    当我们需要获取动态网页的内容时,传统的爬虫方式已经无法满足需求,这时候我们可以考虑使用Python抓取动态网页内容。下面是Python抓取动态网页内容的详细攻略: 网页内容加载方式 动态网页与静态网页的主要区别在于内容的加载方式。静态网页内容都是在服务器上生成好的,客户端只需要请求一次,就可以得到完整的html代码,而动态网页的内容是通过JavaScript…

    python 2023年5月14日
    00
  • 如何使用python爬虫爬取要登陆的网站

    使用Python爬虫爬取需要登陆的网站,一般需要以下几个步骤: 对目标网站进行分析,找到登录页面的url、用户名输入框、密码输入框、提交按钮等。 使用Python的requests库发起登录请求。代码示例如下: import requests # 填写登录信息 username = ‘your_username’ password = ‘your_passw…

    python 2023年5月14日
    00
  • Python利用AI接口实现抠图并改图片底色

    Python利用AI接口实现抠图并改图片底色 在Python中,我们可以使用AI接口实现抠图并改变图片底色。本文将详细讲解如何使用Python调用AI接口,包括如何安装和使用AI接口、如何实现抠图和改变底色等。 安装和使用AI接口 首先,我们需要安装AI接口。以下是一个示例,演示如何使用pip安装AI接口pytesseract: pip install py…

    python 2023年5月15日
    00
  • 详解Python打印元组的键和值

    下面是Python程序打印元组的键和值使用方法的完整攻略。 一、元组 元组(Tuple)是Python中的不可变(immutable)有序序列,可以用来存储多个值。元组使用圆括号 () 表示,多个值之间使用逗号,例如: t = (1, 2, ‘a’, ‘b’) 二、打印元组 Python提供了多种方法打印元组的键和值,下面介绍两种方法。 1.使用for循环打…

    python-answer 2023年3月25日
    00
  • 利用python爬取有道词典的方法

    下面是利用Python爬取有道词典的完整攻略: 1. 安装必要的库 首先,我们需要安装两个必要的Python库:requests和Beautiful Soup 4。打开终端或命令行界面,输入以下命令: pip install requests pip install beautifulsoup4 2. 网页分析 在正式编写爬虫之前,我们需要先分析一下有道词典…

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