registry-cleaner/regclean

119 lines
4.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# URL локального реестра
REGISTRY_URL="http://localhost:5000"
# Имя контейнера реестра (для команды clean)
REGISTRY_CONTAINER="registry"
show_help() {
echo "Использование: regclean <команда> [аргументы]"
echo ""
echo "Команды:"
echo " get <имя_образа> Получить список тегов для указанного образа в локальном Docker Registry."
echo " Пример: regclean get myimage"
echo " del <имя_образа> <тег> Удалить образ с указанным тегом из локального Docker Registry."
echo " Пример: regclean del myimage 1.0.1"
echo " clean Очистить ненужные слои (garbage collection) в локальном Docker Registry."
echo " Пример: regclean clean"
echo " help Показать эту справку."
echo " Пример: regclean help"
echo ""
echo "Требования:"
echo " - Локальный реестр должен быть запущен (по умолчанию на http://localhost:5000)."
echo " - Для команды 'del' требуется переменная окружения REGISTRY_STORAGE_DELETE_ENABLED=true в реестре."
echo " - Контейнер реестра должен называться 'registry' для команды 'clean'."
echo ""
echo "Примечания:"
echo " - Убедитесь, что утилиты curl, grep, awk, sed и tr установлены на хосте."
echo " - Измените REGISTRY_URL в скрипте, если ваш реестр работает не на localhost:5000."
}
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 "Ошибка: укажите имя образа (например, regclean get myimage)"
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 "Ошибка: укажите имя образа и тег (например, regclean del myimage 1.0.1)"
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
;;
"help"|"")
show_help
;;
*)
echo "Неизвестная команда: $1"
show_help
exit 1
;;
esac