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