Работа с 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:
-
docker rmi -f **imageid**
-
rm -Rf /home/**homedirectory**/docker-registry/data/docker/registry/v2/repositories/**yoursystemname**/**yourimagename**/_manifests/tags/**image version**/
-
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.