GitLab: Как вывести список контейнеров с размером - PullRequest
0 голосов
/ 05 декабря 2018

У меня установлена ​​автономная установка GitLab CE Omnibus (версия 11.5.2), включая реестр контейнеров.Теперь размер диска, необходимого для размещения всех этих контейнеров, увеличивается довольно быстро.Как администратор, я хочу перечислить все образы Docker в этом реестре, включая их размер, поэтому я могу, возможно, разрешить их удаление.

Возможно, я не выглядел достаточно усердно, но в настоящее время я не могу что-то найтив админ-панели GitLab.Прежде чем приступить к созданию сценария сравнения странных связей между каталогами repositories и blobs в /var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2, а затем агрегировать размеры на основе репозиториев, я хотел бы спросить:

Isкакая-нибудь команда CLI или даже вызов curl для регистрации нужной информации?

1 Ответ

0 голосов
/ 10 декабря 2018

Благодаря большому комментарию @Rekovni моя проблема кое-как решена.

Первый : Огромное количество используемого дискового пространства в Docker Images было связано с ошибкой в ​​Gitlab / DockerРеестр.Перейдите по ссылке из комментария Рековни под моим вопросом.

Второй : В его ссылке также есть экспериментальный инструмент , который разрабатывается 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, написанный выше.Вы можете использовать некрасивый сценарий так, как вам нравится, но я не несу никакой ответственности.

...