223 lines
5.7 KiB
Bash
Executable file
223 lines
5.7 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Self-cleaning script for fetch_ml Docker resources
|
|
# Usage: ./scripts/cleanup.sh [--dry-run] [--force] [--all]
|
|
|
|
set -euo pipefail
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Default options
|
|
DRY_RUN=false
|
|
FORCE=false
|
|
ALL=false
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--dry-run)
|
|
DRY_RUN=true
|
|
shift
|
|
;;
|
|
--force)
|
|
FORCE=true
|
|
shift
|
|
;;
|
|
--all)
|
|
ALL=true
|
|
shift
|
|
;;
|
|
--help|-h)
|
|
echo "Usage: $0 [--dry-run] [--force] [--all]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --dry-run Show what would be cleaned without actually doing it"
|
|
echo " --force Skip confirmation prompts"
|
|
echo " --all Clean everything including images"
|
|
echo ""
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Use --help for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Helper functions
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Docker check
|
|
if ! command -v docker &> /dev/null; then
|
|
log_error "Docker is not installed or not in PATH"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if Docker is running
|
|
if ! docker info &> /dev/null; then
|
|
log_error "Docker daemon is not running"
|
|
exit 1
|
|
fi
|
|
|
|
log_info "Starting cleanup of fetch_ml Docker resources..."
|
|
|
|
# Function to count resources
|
|
count_resources() {
|
|
local containers=$(docker ps -a --filter "name=ml-" --format "{{.Names}}" | wc -l)
|
|
local images=$(docker images --filter "reference=fetch_ml-*" --format "{{.Repository}}" | wc -l)
|
|
local networks=$(docker network ls --filter "name=ml-" --format "{{.Name}}" | wc -l)
|
|
local volumes=$(docker volume ls --filter "name=ml-" --format "{{.Name}}" | wc -l)
|
|
|
|
echo "Containers: $containers, Images: $images, Networks: $networks, Volumes: $volumes"
|
|
}
|
|
|
|
# Show current state
|
|
log_info "Current resources: $(count_resources)"
|
|
|
|
# Dry run mode
|
|
if [ "$DRY_RUN" = true ]; then
|
|
log_info "DRY RUN MODE - No actual cleanup will be performed"
|
|
|
|
echo ""
|
|
log_info "Containers that would be stopped and removed:"
|
|
docker ps -a --filter "name=ml-" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" || echo "No containers found"
|
|
|
|
echo ""
|
|
log_info "Images that would be removed:"
|
|
if [ "$ALL" = true ]; then
|
|
docker images --filter "reference=fetch_ml-*" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" || echo "No images found"
|
|
else
|
|
echo "Use --all to remove images"
|
|
fi
|
|
|
|
echo ""
|
|
log_info "Networks that would be removed:"
|
|
docker network ls --filter "name=ml-" --format "table {{.Name}}\t{{.Driver}}" || echo "No networks found"
|
|
|
|
echo ""
|
|
log_info "Volumes that would be removed:"
|
|
docker volume ls --filter "name=ml-" --format "table {{.Name}}\t{{.Driver}}" || echo "No volumes found"
|
|
|
|
exit 0
|
|
fi
|
|
|
|
# Confirmation prompt
|
|
if [ "$FORCE" = false ]; then
|
|
echo ""
|
|
read -p "This will stop and remove all fetch_ml containers. Continue? (y/N): " -n 1 -r
|
|
echo ""
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
log_info "Cleanup cancelled"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Stop containers
|
|
log_info "Stopping containers..."
|
|
containers=$(docker ps -q --filter "name=ml-")
|
|
if [ -n "$containers" ]; then
|
|
if [ "$DRY_RUN" = false ]; then
|
|
echo "$containers" | xargs docker stop
|
|
log_success "Containers stopped"
|
|
fi
|
|
else
|
|
log_info "No running containers found"
|
|
fi
|
|
|
|
# Remove containers
|
|
log_info "Removing containers..."
|
|
containers=$(docker ps -aq --filter "name=ml-")
|
|
if [ -n "$containers" ]; then
|
|
if [ "$DRY_RUN" = false ]; then
|
|
echo "$containers" | xargs docker rm
|
|
log_success "Containers removed"
|
|
fi
|
|
else
|
|
log_info "No containers found"
|
|
fi
|
|
|
|
# Remove networks
|
|
log_info "Removing networks..."
|
|
networks=$(docker network ls -q --filter "name=ml-")
|
|
if [ -n "$networks" ]; then
|
|
if [ "$DRY_RUN" = false ]; then
|
|
echo "$networks" | xargs docker network rm
|
|
log_success "Networks removed"
|
|
fi
|
|
else
|
|
log_info "No networks found"
|
|
fi
|
|
|
|
# Remove volumes (with caution)
|
|
log_warning "Skipping volumes by default (use --all to remove them)"
|
|
if [ "$ALL" = true ]; then
|
|
volumes=$(docker volume ls -q --filter "name=ml-")
|
|
if [ -n "$volumes" ]; then
|
|
if [ "$DRY_RUN" = false ]; then
|
|
echo "$volumes" | xargs docker volume rm
|
|
log_success "Volumes removed"
|
|
fi
|
|
else
|
|
log_info "No volumes found"
|
|
fi
|
|
else
|
|
log_info "Skipping volumes"
|
|
fi
|
|
|
|
# Remove images if requested
|
|
if [ "$ALL" = true ]; then
|
|
log_info "Removing images..."
|
|
images=$(docker images -q --filter "reference=fetch_ml-*")
|
|
if [ -n "$images" ]; then
|
|
if [ "$DRY_RUN" = false ]; then
|
|
echo "$images" | xargs docker rmi
|
|
log_success "Images removed"
|
|
fi
|
|
else
|
|
log_info "No images found"
|
|
fi
|
|
else
|
|
log_info "Skipping images (use --all to remove them)"
|
|
fi
|
|
|
|
# General Docker cleanup
|
|
if [ "$ALL" = true ]; then
|
|
log_info "Running general Docker cleanup (docker system prune)..."
|
|
if [ "$DRY_RUN" = false ]; then
|
|
docker system prune -f
|
|
log_success "General cleanup completed"
|
|
fi
|
|
else
|
|
log_info "Skipping docker system prune (use --all to enable)"
|
|
fi
|
|
|
|
# Show final state
|
|
log_info "Final resources: $(count_resources)"
|
|
|
|
# Space reclaimed
|
|
if [ "$DRY_RUN" = false ]; then
|
|
log_info "Docker system info:"
|
|
docker system df
|
|
fi
|
|
|
|
log_success "Cleanup completed!"
|