GitLab:如何列出具有大小的注册表容器

时间:2018-12-05 09:08:12

标签: docker gitlab registry administration

我有一个自托管的GitLab CE Omnibus安装(版本11.5.2),其中包括容器注册表。 现在,托管所有这些容器所需的磁盘大小迅速增加。 作为管理员,我想列出此注册表中的所有Docker映像,包括其大小,以便我可以删除它们。

也许我看起来不够努力,但是目前,我在GitLab的管理面板中找不到任何内容。在开始制作脚本以比较repositoriesblobs/var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2目录之间的怪异链接,然后根据存储库汇总大小之前,我想问一下: / p>

是否有一些CLI命令甚至对注册表进行curl调用以获得我想要的信息?

1 个答案:

答案 0 :(得分:1)

感谢@Rekovni的好评,我的问题已经解决了。

第一:Docker Images大量使用的磁盘空间是由于Gitlab / Docker Registry中的错误所致。在我的问题下方,点击Rekovni的评论链接。

第二:在他的链接中,还有一个an experimental tool,它是由GitLab开发的。它列出并有选择地删除那些旧的未使用的Docker层(与该错误有关)。

第三:如果有人想做自己的事情,我会整理一个丑陋的脚本,列出每个回购的图像大小:

#!/usr/bin/env python3
# coding: utf-8

import os
from os.path import join, getsize
import subprocess

def get_human_readable_size(size,precision=2):
    suffixes=['B','KB','MB','GB','TB']
    suffixIndex = 0
    while size > 1024 and suffixIndex < 4:
        suffixIndex += 1
        size = size/1024.0
    return "%.*f%s"%(precision,size,suffixes[suffixIndex])


registry_path = '/var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2/'
repos = []

for repo in os.listdir(registry_path + 'repositories'):
    images = os.listdir(registry_path + 'repositories/' + repo)
    for image in images:
        try:
            layers = os.listdir(registry_path + 'repositories/{}/{}/_layers/sha256'.format(repo, image))
            imagesize = 0
            # get image size
            for layer in layers:
                # get size of layer
                for root, dirs, files in os.walk("{}/blobs/sha256/{}/{}".format(registry_path, layer[:2], layer)):
                     imagesize += (sum(getsize(join(root, name)) for name in files))
            repos.append({'group': repo, 'image': image, 'size': imagesize})
        # if folder doesn't exists, just skip it
        except FileNotFoundError:
            pass

repos.sort(key=lambda k: k['size'], reverse=True)
for repo in repos:
    print("{}/{}: {}".format(repo['group'], repo['image'], get_human_readable_size(repo['size'])))

但是请注意,它确实是静态的,没有列出图像的特定标签,也没有考虑其他图像也可能使用某些图层。但是,如果您不想使用上面编写的Gitlab工具,它将为您提供一个粗略的估计。您可以随意使用丑陋的脚本,但是我不承担任何责任。