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