#!/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