fetch_ml/scripts/maintenance/cleanup.sh
Jeremie Fraeys 1dcc1e11d5
chore(build): update build system, scripts, and additional tests
- Update Makefile with native build targets (preparing for C++)
- Add profiler and performance regression detector commands
- Update CI/testing scripts
- Add additional unit tests for API, jupyter, queue, manifest
2026-02-12 12:05:55 -05:00

223 lines
5.7 KiB
Bash
Executable file

#!/usr/bin/env 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!"