119 lines
4.6 KiB
Bash
Executable File
119 lines
4.6 KiB
Bash
Executable File
#!/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
|