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

GitLab: How to list registry containers with size

我有一个自托管的 GitLab CE Omnibus 安装(版本 11.5.2)运行,包括容器注册表。 现在,托管所有这些容器所需的磁盘大小增长得非常快。 作为管理员,我想列出此注册表中的所有 Docker 个图像,包括它们的大小,这样我也许可以删除这些图像。

也许我还没有仔细看,但目前,我在 GitLab 的管理面板中找不到任何东西。在我自己创建一个脚本来比较 /var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2repositoriesblobs 目录之间奇怪的链接,然后根据存储库聚合大小之前,我想问:

是否有一些 CLI 命令或者甚至是对注册表的 curl 调用来获取我想要的信息?

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

首先:Docker 图像使用大量磁盘space 是由于Gitlab/Docker 注册表中的错误。在我的问题下方关注 Rekovni 评论中的 link。

其次:在他的link中,还有an experimental tool,这是GitLab正在开发的。它列出并可选择删除那些旧的未使用的 Docker 层(与错误相关)。

第三:如果有人想做他自己的事,我一起黑了一个非常丑陋的脚本,其中列出了每个 repo 的图像大小:

#!/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 的工具。您可以随意使用丑陋的脚本,但我不承担任何责任。