测试环境的Harbor磁盘已经不堪重负,一天不知道多少个迭代测试包丢上面,清理已经刻不容缓。因公司使用Harbor版本比较老,无法在线清理,故需要两步清理:先删除不需要的tag,然后在使用garbage collection(GC)回收磁盘空间。

Harbor已经在1.7.0版本支持在线清理空间.

一、清理不需要的镜像tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
# 此脚本基于时间排序,仅保留最新的15个tag

import requests
requests.packages.urllib3.disable_warnings()


class CleanHarbor:
def __init__(self, user, password):
self.user = user
self.password = password
self.base_url = "https://registry.youdomain.com/"
self.login_url = self.base_url + 'login'
self.project_url = self.base_url + 'api/projects'
self.repo_url = self.base_url + 'api/repositories'
self.session = requests.Session()
self.session.verify = False
# 此处是个坑,harbor源码auth部分的username是principal,故params参数必须是principal,否则会401
self.session.post(self.login_url, params={"principal": self.user, "password": self.password})

def get_project(self):
project_info = []
harbor_info = self.session.get(self.project_url).json()
for project in harbor_info:
info = {}
info['project_id'] = project['project_id']
info['project_name'] = project['name']
project_info.append(info)
return project_info

def get_delete_repo(self):
project_info = self.get_project()
delete_reponame = []
for project_id in project_info:
repo_info = self.session.get(self.repo_url, params={"project_id": project_id['project_id']}).json()
for repo in repo_info:
if repo['tags_count'] > 15:
delete_reponame.append(repo['name'])
return delete_reponame

def delete_repo_tag(self):
delete_reponame = self.get_delete_repo()
for repo_name in delete_reponame:
tag_url = self.repo_url + "/" + repo_name + "/tags"
tags = self.session.get(tag_url).json()
tags_sort = sorted(tags, key=lambda tags: tags["created"])
del_tags = tags_sort[0:len(tags_sort) - 15]
for tag in del_tags:
del_repo_tag_url = tag_url + "/" + tag['name']
result = self.session.delete(del_repo_tag_url)
if result.status_code == 200:
print('{}:{} tag删除成功..'.format(repo_name, tag['name']))
print("所有tag删除完成...")


if __name__ == "__main__":
Harobr = CleanHarbor('admin', 'Harbor12345')
Harobr.delete_repo_tag()

二、使用garbage collection(GC)机制删除镜像的实际文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 先停止harbor服务
docker-compose down

# 使用gc回收磁盘空间(GC使用“标记-清理”法)
# 第一步,标记:registry扫描元数据,元数据能够索引到的blob标记为不能删除
# 第二步,清理:registry扫描所有blobs,如果该blob没有被标记,则删除它
# 注意此处的registry-photon,请保持和你的版本一致,如下图
image_name=$(docker ps | grep registry | grep photon | awk -F " " '{print $2}')
docker run -it --name gc --rm --volumes-from registry ${image_name} garbage-collect /etc/registry/config.yml


# 启动Harbor
docker-compose start

参考: