commit 821974b5677ceb69864a18e19f1cf0329612bce0 Author: Alexander Zhirov Date: Fri Mar 21 16:52:27 2025 +0300 init diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c4c7e8 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Registry Cleaner + +Очистка локального registry diff --git a/regclean b/regclean new file mode 100755 index 0000000..94c94bd --- /dev/null +++ b/regclean @@ -0,0 +1,94 @@ +#!/bin/bash + +# URL локального реестра +REGISTRY_URL="http://localhost:5000" +# Имя контейнера реестра (для команды clean) +REGISTRY_CONTAINER="registry" + +check_registry() { + if ! docker ps | grep -q "$REGISTRY_CONTAINER"; then + echo "Ошибка: контейнер реестра '$REGISTRY_CONTAINER' не запущен." + exit 1 + fi +} + +get_tags() { + local image_name="$1" + if [ -z "$image_name" ]; then + echo "Ошибка: укажите имя образа (например, ./script.sh get astra-docker)" + exit 1 + fi + + response=$(curl -s "$REGISTRY_URL/v2/$image_name/tags/list") + if echo "$response" | grep -q "errors"; then + echo "Ошибка: не удалось получить теги для '$image_name'. Возможно, образ не существует." + echo "$response" + exit 1 + fi + + tags=$(echo "$response" | grep -o '"tags":\s*\[[^]]*\]' | sed 's/"tags":\s*\[\(.*\)\]/\1/' | tr -d '"' | tr ',' '\n') + if [ -z "$tags" ]; then + echo "Теги для '$image_name' не найдены." + else + echo "Теги для '$image_name':" + echo "$tags" + fi +} + +delete_image() { + local image_name="$1" + local tag="$2" + + if [ -z "$image_name" ] || [ -z "$tag" ]; then + echo "Ошибка: укажите имя образа и тег (например, ./script.sh del astra-docker 1.7.25080.1522)" + exit 1 + fi + + digest=$(curl -s -v -H "Accept: application/vnd.docker.distribution.manifest.v2+json" "$REGISTRY_URL/v2/$image_name/manifests/$tag" 2>&1 | grep "Docker-Content-Digest" | awk '{print $3}' | tr -d '\r') + if [ -z "$digest" ]; then + echo "Ошибка: не удалось получить Digest для '$image_name:$tag'." + exit 1 + fi + + echo "Найден Digest: $digest" + + delete_response=$(curl -s -X DELETE "$REGISTRY_URL/v2/$image_name/manifests/$digest") + if [ -n "$delete_response" ] && echo "$delete_response" | grep -q "errors"; then + echo "Ошибка при удалении '$image_name:$tag':" + echo "$delete_response" + exit 1 + fi + + echo "Успешно удален '$image_name:$tag' (Digest: $digest)" +} + +clean_registry() { + check_registry + echo "Запуск очистки ненужных слоев..." + docker exec "$REGISTRY_CONTAINER" bin/registry garbage-collect /etc/docker/registry/config.yml + if [ $? -eq 0 ]; then + echo "Очистка завершена успешно." + else + echo "Ошибка при очистке." + exit 1 + fi +} + +case "$1" in + "get") + get_tags "$2" + ;; + "del") + delete_image "$2" "$3" + ;; + "clean") + clean_registry + ;; + *) + echo "Использование:" + echo " ./script.sh get <имя_образа> - получить список тегов" + echo " ./script.sh del <имя_образа> <тег> - удалить образ с указанным тегом" + echo " ./script.sh clean - очистить ненужные слои" + exit 1 + ;; +esac