Initial commit

This commit is contained in:
2026-03-14 03:19:13 +04:00
commit 460e8e5ecf
5 changed files with 941 additions and 0 deletions

159
clear-registry Normal file
View File

@@ -0,0 +1,159 @@
#!/bin/bash
# Function to check and install required utilities
check_and_install_deps() {
local deps=("skopeo" "jq" "grep" "sort" "head")
local missing_deps=()
# Check availability of each utility
for dep in "${deps[@]}"; do
if ! command -v "$dep" &> /dev/null; then
missing_deps+=("$dep")
fi
done
# If all utilities are installed, exit
if [ ${#missing_deps[@]} -eq 0 ]; then
echo "✓ All required utilities are installed."
return 0
fi
echo "❌ The following utilities are missing: ${missing_deps[*]}"
echo "🔍 Attempting to install..."
# Determine package manager and install missing utilities
if command -v apt &> /dev/null; then
# Debian/Ubuntu
sudo apt update
sudo apt install -y "${missing_deps[@]}"
elif command -v apt-get &> /dev/null; then
# Debian/Ubuntu (alternative)
sudo apt-get update
sudo apt-get install -y "${missing_deps[@]}"
elif command -v pacman &> /dev/null; then
# Arch Linux
for dep in "${missing_deps[@]}"; do
case $dep in
"skopeo")
sudo pacman -S --noconfirm skopeo
;;
"jq")
sudo pacman -S --noconfirm jq
;;
"grep"|"sort"|"head")
# These utilities are usually part of coreutils
sudo pacman -S --noconfirm coreutils
;;
esac
done
elif command -v apk &> /dev/null; then
# Alpine Linux
sudo apk add "${missing_deps[@]}"
elif command -v yum &> /dev/null; then
# RHEL/CentOS 7
sudo yum install -y epel-release
sudo yum install -y "${missing_deps[@]}"
elif command -v dnf &> /dev/null; then
# Fedora/RHEL 8+
sudo dnf install -y "${missing_deps[@]}"
elif command -v zypper &> /dev/null; then
# openSUSE
sudo zypper install -y "${missing_deps[@]}"
else
echo "❌ Could not determine package manager. Install utilities manually: ${missing_deps[*]}"
exit 1
fi
# Check if utilities were installed successfully
local failed_deps=()
for dep in "${missing_deps[@]}"; do
if ! command -v "$dep" &> /dev/null; then
failed_deps+=("$dep")
fi
done
if [ ${#failed_deps[@]} -gt 0 ]; then
echo "❌ Failed to install: ${failed_deps[*]}"
exit 1
else
echo "✓ All missing utilities were successfully installed."
fi
}
# Function to display help
show_help() {
echo "Usage: $0 <repository> [number_of_tags]"
echo ""
echo "Arguments:"
echo " <repository> - Docker repository URL or name (required)"
echo " [number_of_tags] - number of recent tags to keep (default: 3)"
echo ""
echo "Examples:"
echo " $0 docker.io/library/alpine"
echo " $0 myregistry.local:5000/myapp 5"
echo " $0 registry.example.com/project/image 10"
}
# Check for the first argument
if [ -z "$1" ]; then
echo "❌ Error: repository not specified"
echo ""
show_help
exit 1
fi
# Check and install dependencies
check_and_install_deps
# Set the number of tags to keep
KEEP_TAGS=${2:-3}
# Check that the number of tags is a positive number
if ! [[ "$KEEP_TAGS" =~ ^[0-9]+$ ]] || [ "$KEEP_TAGS" -lt 1 ]; then
echo "❌ Error: number of tags must be a positive number"
exit 1
fi
echo "🔍 Fetching list of tags for $1..."
echo "📦 Will keep $KEEP_TAGS recent tags (excluding latest)"
# Fetch all tags
allTags=$(skopeo list-tags docker://"$1" 2>/dev/null | jq -r '.Tags[]')
if [ -z "$allTags" ]; then
echo "❌ Error: could not fetch tag list or repository is empty"
exit 1
fi
# Count total number of tags
totalTags=$(echo "$allTags" | wc -l)
# Determine how many tags to delete
tagsToDelete=$((totalTags - KEEP_TAGS - 1)) # -1 for latest
if [ "$tagsToDelete" -le 0 ]; then
echo "✓ Total tags: $totalTags (including latest)"
echo "✓ Nothing to delete, keeping all $totalTags tags"
exit 0
fi
# Get tags to delete (exclude latest and keep KEEP_TAGS recent ones)
oldTags=$(echo "$allTags" | grep -v "latest" | sort | head -n -"$KEEP_TAGS")
echo "📊 Total tags: $totalTags (including latest)"
echo "🗑️ Will be deleted: $(echo "$oldTags" | wc -l) tags"
echo ""
# Delete old tags
for tag in $oldTags; do
echo " ➜ Deleting: $tag"
if skopeo delete docker://"$1:$tag" 2>/dev/null; then
echo " ✓ Successfully deleted"
else
echo " ❌ Error deleting $tag"
fi
done
echo ""
echo "✅ Done!"
echo "📝 Kept: $KEEP_TAGS recent tags and latest"