centos卸载harbor_详解:Harbor镜像仓库清理

本文介绍了一种自动化清理Harbor镜像仓库的方法,包括编写Python脚本遍历项目,删除超过特定数量标签的旧镜像,并展示了如何通过Docker的garbage-collect命令进一步释放磁盘空间。
摘要由CSDN通过智能技术生成

导读

docker镜像仓库中镜像的清理,一直是个比较麻烦的事情。尤其是在测试环境当中,每天都会有大量的构建。由此会产生大量的历史镜像,而这些镜像,大多数都没有用。

6c8e0d09665851dc1eaaee4ea53f183d.png

在harbor中,清理镜像,也得分为两步,第一步是从ui中删除历史镜像。这个时候镜像并不会被真正删除,好在harbor集成了镜像删除的功能。

清理UI中的镜像

清理ui中的镜像,如果直接通过图形界面一个个的点击删除的话,在有大规模镜像需要清理的时候,简直就是灾难,而且这种方式,实在太low。

我这里简单写了个脚本,以实现如下功能:

遍历所有project

获取project中所有tag数超过30的repositories

获取这些tag数超过30的repositories的所有tag

基于时间排序,保留最新的30个tag

删除其他tag

脚本示例

#! /usr/bin/env python

# -*- coding:utf-8 -*-

import requests

import json

class RequestClient(object):

def __init__(self,login_url, username, password):

self.username = username

self.password = password

self.login_url = login_url

self.session = requests.Session()

self.login()

def login(self):

self.session.post(self.login_url, params={"principal": self.username, "password": self.password})

class ClearHarbor(object):

def __init__(self, harbor_domain, password, schema="https",

username="admin"):

self.schema = schema

self.harbor_domain = harbor_domain

self.harbor_url = self.schema + "://" + self.harbor_domain

self.login_url = self.harbor_url + "/login"

self.api_url = self.harbor_url + "/api"

self.pro_url = self.api_url + "/projects"

self.repos_url = self.api_url + "/repositories"

self.username = username

self.password = password

self.client = RequestClient(self.login_url, self.username, self.password)

def __fetch_pros_obj(self):

# TODO

self.pros_obj = self.client.session.get(self.pro_url).json()

return self.pros_obj

def fetch_pros_id(self):

self.pros_id = []

# TODO

pro_res = self.__fetch_pros_obj()

for i in pro_res:

self.pros_id.append(i['project_id'])

return self.pros_id

def fetch_del_repos_name(self, pro_id):

self.del_repos_name = []

repos_res = self.client.session.get(self.repos_url, params={"project_id": pro_id})

# TODO

for repo in repos_res.json():

if repo["tags_count"] > 30:

self.del_repos_name.append(repo['name'])

return self.del_repos_name

def fetch_del_repos(self, repo_name):

self.del_res = []

tag_url = self.repos_url + "/" + repo_name + "/tags"

# TODO

tags = self.client.session.get(tag_url).json()

tags_sort = sorted(tags, key=lambda a: a["created"])

#print(tags_sort)

del_tags = tags_sort[0:len(tags_sort) -30]

#print(del_tags)

for tag in del_tags:

del_repo_tag_url = tag_url + "/" + tag['name']

print(del_repo_tag_url)

del_res = self.client.session.delete(del_repo_tag_url)

self.del_res.append(del_res)

return self.del_res

if __name__ == "__main__":

harbor_domain = "hub.test.com"

password = "xxxxxxx"

res = ClearHarbor(harbor_domain,password)

# 循环所有的project id

for i in res.fetch_pros_id():

# 获取所有tag超过30的repos

repos = res.fetch_del_repos_name(i)

if repos:

print(repos)

for repo in repos:

del_repos = res.fetch_del_repos(repo)

print(del_repos)

清理镜像释放空间

如开篇所说,通过ui清理镜像并不会真正将这些镜像从磁盘删除。要想真正释放磁盘空间,还得执行如下操作:

# 可以在参数中使用--dry-run以试运行(生产环境中还是尽量试运行下)

docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect /etc/registry/config.yml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值