Очистка места в gitlab-registry

Thank you for reading this post, don't forget to subscribe!

Не так дав­но обна­ру­жи­лись про­бле­мы с очист­кой места, кото­рое зани­ма­ют собран­ные docker-обра­зы в настро­ен­ном нами docker-registry

Выяс­ни­лось, что в веб-интер­фей­се Gitlab на вклад­ке Registry при нажа­тии на кноп­ку «уда­лить» на самом деле про­ис­хо­дит уда­ле­ние толь­ко тэга обра­за, а сами дан­ные нику­да не дева­ют­ся и про­дол­жа­ют зани­мать место на жест­ком диске.

Ана­ло­гич­ная про­бле­ма наблю­да­ет­ся если docker-образ созда­ет­ся с одним и тем же тэгом (напри­мер, latest) — а это обыч­ное дело для про­цес­са CI. В этом слу­чае, при сбор­ке ново­го обра­за ста­рый не уда­ля­ет­ся (как ожи­да­ет­ся), у него про­сто про­па­да­ет тэг (latest).

 

Напри­мер, у обра­за master/lebed/test:latest на самом деле на жест­ком дис­ке хра­нит­ся 2 версии:

При частых сбор­ках docker-обра­зов отве­ден­ное место в docker-registry может закон­чить­ся — при этом невоз­мож­но будет пушить в него новые обра­зы и весь про­цесс CI пере­ста­нет работать.

 

Для очист­ки места в при­ват­ном docker-registry необ­хо­ди­мо выпол­нить сле­ду­ю­щие действия:

  • уда­лить ста­рые вер­сии тегов docker-образа;
  • уда­лить ста­рые вер­сии реви­зий docker-образа;
  • запу­стить про­цесс «убор­ки мусо­ра» в кон­тей­не­ре с docker-registry.

Рас­смот­рим подроб­нее при­мер выпол­не­ния дан­ных дей­ствий. Нахо­дясь на docker-хосте, смот­рим содер­жи­мое ката­ло­га с инте­ре­су­ю­щим нас docker-обра­зом и его тэгом в каталоге

/srv/gitlab/shared/registry/docker/registry/v2/repositories/{имя_докер_образа}/_manifests/tags/{тег_образа}/index/sha256

 

В нем долж­ны нахо­дить­ся один или несколь­ко ката­ло­гов вида

e1f5741ced3f0280bd372baa6ca293d1033dfefc7db021cd81ca1527d2f1c08e.

Если ката­лог один, то ника­ких дей­ствий про­из­во­дить не сле­ду­ет, если же таких дирек­то­рий несколь­ко, то нуж­но уда­лить все ста­рые вер­сии, оста­вив толь­ко одну, самую послед­нюю по дате создания.

 

Смот­рим содер­жи­мое ката­ло­га с реви­зи­я­ми инте­ре­су­ю­ще­го нас docker-образа 

/srv/gitlab/shared/registry/docker/registry/v2/repositories/{имя_докер_образа}/_manifests/revisions/sha256

В нем долж­ны так­же быть вло­же­ны дирек­то­рии с име­на­ми вида

e1f5741ced3f0280bd372baa6ca293d1033dfefc7db021cd81ca1527d2f1c08e — точ­но такие же, как и в преды­ду­щем шаге. Уда­ля­ем более ста­рые (ори­ен­ти­ру­ем­ся по дате созда­ния), остав­ляя толь­ко один каталог.

После уда­ле­ния выше­ука­зан­ных фай­лов запус­ка­ем про­цесс «убор­ки мусо­ра» командой:

docker exec -it {имя_контейнера_c_registry} bin/registry garbage-collect {путь_к_конфигу_внутри_контейнера}

 

В нашем слу­чае коман­да выгля­дит так:

docker exec -it docker-registry bin/registry garbage-collect /etc/docker/registry/config.yml
путь до конфига также может быть следующим: (/var/opt/gitlab/registry/config.yml)

 

Для чист­ки места так­же мож­но исполь­зо­вать скрипт clean_docker_registry.sh сле­ду­ю­ще­го содержания:

#!/bin/sh
REPOPATH=/srv/gitlab/shared/registry/docker/registry/v2/repositories/
echo Docker image name is $1
echo Docker image tag is $2
echo "\n";
TAGPATH=$REPOPATH$1/_manifests/tags/$2/index/sha256
REVPATH=$REPOPATH$1/_manifests/revisions/sha256
for hash in $(ls $TAGPATH -t | tail -n +2)
do
rm -rf $TAGPATH/$hash;
rm -rf $REVPATH/$hash;
done
docker exec -it docker-registry bin/registry garbage-collect /etc/docker/registry/config.yml

 

Запус­ка­ем скрипт с пара­мет­ра­ми, пер­вый из кото­рых — имя docker-обра­за, вто­рой — тэг docker-обра­за, например:

./clean_docker_registry.sh master/lebed/test latest так­же мож­но вос­поль­зо­вать­ся сле­ду­ю­щим скриптом:

 

========================================================================================

Рабо­чий скрипт для запус­ка кото­ро­го необходимо
/root/scripts/gitlab-registry-gc.sh -k 5 -r
k 5 - это коли­че­ство остав­ля­е­мых слоёв:

ну или как в самом скрип­те указано:

{ echo "STARTING EXEC $(date)"; /root/clean.sh -k 5 -r; } >> /root/stdout_gitlab-registry-gc.$(date "+\%Y\%m").log 2>&1