This commit is contained in:
Alexander Zhirov 2025-03-21 16:52:27 +03:00
commit 821974b567
2 changed files with 97 additions and 0 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# Registry Cleaner
Очистка локального registry

94
regclean Executable file
View File

@ -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