Перейти к содержимому. | Перейти к навигации

Персональные инструменты

Вы здесь: Главная / Спиричев Вадим / СофтСервис / Работа с docker registry - чистка и удаление. / Основные приемы работы с docker registry.

Основные приемы работы с docker registry.

Просмотр, удаление, чистка.

 

Работа с registry выполняется с помощью скрипта упакованного в docker-контейнер. Запуск и варианты использования описаны в заметке или по ссылке.

Приведем лишь основные команды:

 1. Вывод содержимого;

docker run --rm  --network="deploy_default" --link registry anoxis/registry-cli -r https://r5000:5000 --no-validate-ssl

2. Вывод тэгов для image (содержимое репозитория):

docker run --rm  --network="deploy_default" --link registry anoxis/registry-cli -r https://r5000:5000 --no-validate-ssl -i worker
---------------------------------
Image: worker
  tag: 2253cfd297b4e640e334fb0d9ca02c2b204f7d15
  tag: 64bcc659868c9751be9d5aade9c1c1015452f003
  tag: a0da22830948a22848ec5a0ddbbc7d82dfdb96cf

3. Удалить тэги image;

docker run --rm  --network="deploy_default" --link registry anoxis/registry-cli -r https://r5000:5000 --no-validate-ssl -i worker --delete-all

4. Удалить конкретный тэг;

docker run --rm  --network="deploy_default" --link registry anoxis/registry-cli -r https://r5000:5000 --no-validate-ssl -i worker --delete --tags-like "a0da22830948a" 

 

Чтобы все действительно удалилось необходимо провести процедуру "сборки мусора" garbage collection (делается не останавливая работу контейнера):

docker exec registry registry garbage-collect  /etc/docker/registry/config.yml --delete-untagged=true

или

docker exec registry registry garbage-collect  /etc/docker/registry/config.yml -m

!!! разобраться с разницей этих комманд!

Looking at this garbage-collect binary help:

Usage: 
  registry garbage-collect <config> [flags]
Flags:
  -m, --delete-untagged=false: delete manifests that are not currently referenced via tag
  -d, --dry-run=false: do everything except remove the blobs
  -h, --help=false: help for garbage-collect

https://stackoverflow.com/questions/29802202/docker-registry-2-0-how-to-delete-unused-images

 

5. И, наконец, про удаление repository (т.е. вхождения image) из registry. Способа сделать это через какой-нибудь API НЕ СУЩЕСТВУЕТ!

Можно удалить только удалив нужный каталог в файловой системе на хосте, предварительно удалив все тэги и выполнив garbage collection. Перед удалением необходимо остановить контейнер с registry.

 

Repositories docker registry находятся в named docker volume !


Их можно найти так, например:

find / -name repositories
...
/var/lib/docker/volumes/
acf97cc87471ca9385bb8c0dcc2e83e51fc2eb22c05676c62d930b1b938cb9d8/
_data/docker/registry/v2/repositories/

Удалить repository можно только командой rm -rf, после удаления всех тэгов
и garbage collection !

docker stop registry
sudo rm -rf /var/lib/docker/volumes/
acf97cc87471ca9385bb8c0dcc2e83e51fc2eb22c05676c62d930b1b938cb9d8/
_data/docker/registry/v2/repositories/helloworld2121/
docker start registry

это пример удаления repository для имиджа helloworld2121

 

Как выяснилось, все описанное в п.п.1-4 не работает по непонятным причинам!

Поиски решения привели к программам работы с registry представленными здесь.

Это потребовало изменения формата сертификата доступа к registry, что и было успешно проделано (команда генерации ключей нужного формата описана в заметке).  Набор средств regclient интересен своими функциями для работы с registry, но задачу удаления тэга из repository с помощью этого средства тоже не удалось решить (!).

В результате дальнейших поисков было найдено "брутальное" решение (копия решения описанного в п.5!) подсмотренное в дискуссии по ссылке: https://stackoverflow.com/questions/29802202/docker-registry-2-0-how-to-delete-unused-images

...

For removing unsed images, three steps manually on these sequence:

  1. docker rmi -f **imageid**

  2. rm -Rf /home/**homedirectory**/docker-registry/data/docker/registry/v2/repositories/**yoursystemname**/**yourimagename**/_manifests/tags/**image version**/

  3. docker exec $(docker ps -q) bin/registry garbage-collect /etc/docker/registry/config.yml -m

*Pay attention:

** You must execute those commands (above) in test environment, because if you commit any mistake or didn't understand any step, you don't damage your production environment.

** You can schedule those commands (above) using crontab as root. In the step 3) you must execute removing "-it", as result: docker exec $(docker ps -q) bin/registry garbage-collect /etc/docker/registry/config.yml -m`.

It works for me for more than 6 months.

...

В результате был написан небольшой скрипт для удаления вхождения тэга для repository в registry:

#!/bin/bash

if [ "$#" -ne 3 ]; then
    echo "Usage: dal-tag.sh <reg-container-name> <repository(image-name)> <tag>"
    exit 0
fi

docker stop $1

sudo rm -rf /var/lib/docker/volumes/
acf97cc87471ca9385bb8c0dcc2e83e51fc2eb22c05676c62d930b1b938cb9d8/
_data/docker/registry/v2/repositories/$2/_manifests/tags/$3/

docker start $1
docker exec $1 registry garbage-collect /etc/docker/registry/config.yml -m

 

Т.е. мы тупо удаляем подкаталог тэга из файловой системы, в данном случае из docker named volume (на хост-машине!) временно останавливая контейнер с registry и выполняя garbage collection.