博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Harbor镜像清理
阅读量:6387 次
发布时间:2019-06-23

本文共 3415 字,大约阅读时间需要 11 分钟。

目录

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

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

废话不多说,直接给操作。

清理UI中的镜像

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

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

  1. 遍历所有project
  2. 获取project中所有tag数超过30的repositories
  3. 获取这些tag数超过30的repositories的所有tag
  4. 基于时间排序,保留最新的30个tag
  5. 删除其他tag

脚本示例:

#! /usr/bin/env python# -*- coding:utf-8 -*-import requestsimport jsonclass 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_resif __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

转载于:https://www.cnblogs.com/breezey/p/10615231.html

你可能感兴趣的文章
微信支付遇到的坑
查看>>
.NET中数据库的连接方法
查看>>
【转】一步一步学Linq to sql(四):查询句法
查看>>
文件上传案例
查看>>
基础回顾
查看>>
poi--导入
查看>>
angular第六天
查看>>
可添加至收藏夹并在浏览器地址栏运行的JS代码
查看>>
关于涉及到浮点数的运算及输出问题
查看>>
解决IE6、IE7、IE8、Firefox兼容的两种方案
查看>>
怎么给网站添加ICO图标
查看>>
java Calendar 日期的加减
查看>>
重写之后的脚本。希望还好
查看>>
简明解释算法中的大O符号
查看>>
环境搭建
查看>>
房间安排http://acm.nyist.net/JudgeOnline/problem.php?pid=168
查看>>
Effective Objective-C 2.0 — 第11条:理解 objc_msgSend 的作用
查看>>
模板:快速幂
查看>>
【Python第三篇】Python装饰器、生成器、迭代器
查看>>
JVM中的Stack和Frame
查看>>