sharenet/scripts/dind-cleanup.sh
continuist f11348f209
Some checks are pending
CI/CD Pipeline (DinD) / Test Backend (DinD) (push) Waiting to run
CI/CD Pipeline (DinD) / Test Frontend (DinD) (push) Waiting to run
CI/CD Pipeline (DinD) / Build and Push Docker Images (DinD) (push) Blocked by required conditions
CI/CD Pipeline (DinD) / Deploy to Production (push) Blocked by required conditions
Consolidate DinD cleanup process
2025-06-29 22:18:13 -04:00

232 lines
No EOL
7 KiB
Bash
Executable file

#!/bin/bash
# Docker-in-Docker Cleanup Script
# This script provides a simple way to clean up the DinD environment
# by restarting the DinD container, which gives a fresh environment.
set -e
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Logging 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"
}
show_help() {
cat << EOF
Docker-in-Docker Cleanup Script
Usage: $0 [OPTIONS]
Options:
--dry-run Show what would be done without executing
--help|-h Show this help message
Examples:
$0 # Clean up DinD environment
$0 --dry-run # Show what would be done
EOF
}
# Parse command line arguments
DRY_RUN="false"
while [[ $# -gt 0 ]]; do
case $1 in
--dry-run)
DRY_RUN="true"
shift
;;
--help|-h)
show_help
exit 0
;;
*)
log_error "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Main cleanup function
cleanup_dind() {
echo
echo "=================================================================================="
echo " 🧹 Docker-in-Docker Cleanup 🧹"
echo "=================================================================================="
echo
# Check if DinD container exists
if ! docker ps -a --format "{{.Names}}" | grep -q "^ci-cd-dind$"; then
log_error "DinD container 'ci-cd-dind' not found!"
log_info "Creating new DinD container..."
if [ "$DRY_RUN" = "true" ]; then
log_info "DRY RUN: Would create DinD container"
return
fi
docker run -d \
--name ci-cd-dind \
--privileged \
--restart unless-stopped \
-p 2376:2376 \
-v ci-cd-data:/var/lib/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
docker:dind
log_success "DinD container created successfully"
return
fi
# Check if DinD container is running
if docker ps --format "{{.Names}}" | grep -q "^ci-cd-dind$"; then
log_info "DinD container is running"
if [ "$DRY_RUN" = "true" ]; then
log_info "DRY RUN: Would stop and restart DinD container"
log_info "DRY RUN: This would clear all CI/CD artifacts and give fresh environment"
return
fi
log_info "Stopping DinD container..."
docker stop ci-cd-dind
log_info "Removing DinD container..."
docker rm ci-cd-dind
log_info "Creating fresh DinD container..."
docker run -d \
--name ci-cd-dind \
--privileged \
--restart unless-stopped \
-p 2376:2376 \
-v ci-cd-data:/var/lib/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
docker:dind
# Wait for DinD to start
log_info "Waiting for DinD to start..."
sleep 10
# Test DinD connectivity
if timeout 30 bash -c 'until docker exec ci-cd-dind docker version >/dev/null 2>&1; do sleep 1; done'; then
log_success "DinD container is ready!"
else
log_error "DinD container failed to start properly"
exit 1
fi
else
log_info "DinD container exists but is not running"
if [ "$DRY_RUN" = "true" ]; then
log_info "DRY RUN: Would remove and recreate DinD container"
return
fi
log_info "Removing existing DinD container..."
docker rm ci-cd-dind
log_info "Creating fresh DinD container..."
docker run -d \
--name ci-cd-dind \
--privileged \
--restart unless-stopped \
-p 2376:2376 \
-v ci-cd-data:/var/lib/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
docker:dind
# Wait for DinD to start
log_info "Waiting for DinD to start..."
sleep 10
# Test DinD connectivity
if timeout 30 bash -c 'until docker exec ci-cd-dind docker version >/dev/null 2>&1; do sleep 1; done'; then
log_success "DinD container is ready!"
else
log_error "DinD container failed to start properly"
exit 1
fi
fi
echo
echo "=================================================================================="
log_success "DinD cleanup completed successfully!"
echo "=================================================================================="
echo
log_info "Benefits of this cleanup:"
log_info " ✅ Fresh Docker environment for CI/CD"
log_info " ✅ No resource contention with Harbor"
log_info " ✅ Clean state for Rust testing"
log_info " ✅ Isolated CI/CD operations"
echo
}
# Show current DinD status
show_status() {
echo "=================================================================================="
echo " 📊 DinD Status 📊"
echo "=================================================================================="
echo
if docker ps -a --format "{{.Names}}" | grep -q "^ci-cd-dind$"; then
log_info "DinD Container Status:"
docker ps -a --filter "name=ci-cd-dind" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo
if docker ps --format "{{.Names}}" | grep -q "^ci-cd-dind$"; then
log_info "DinD Docker Info:"
docker exec ci-cd-dind docker info --format "{{.ServerVersion}}" 2>/dev/null || log_warning "Cannot connect to DinD Docker daemon"
echo
log_info "DinD Images:"
docker exec ci-cd-dind docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" 2>/dev/null || log_warning "Cannot list DinD images"
echo
log_info "DinD Containers:"
docker exec ci-cd-dind docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" 2>/dev/null || log_warning "Cannot list DinD containers"
else
log_warning "DinD container is not running"
fi
else
log_warning "DinD container does not exist"
fi
echo "=================================================================================="
}
# Main execution
if [ "$DRY_RUN" = "true" ]; then
echo
echo "=================================================================================="
echo " 🚨 DRY RUN MODE 🚨"
echo " No changes will be made"
echo "=================================================================================="
echo
show_status
cleanup_dind
else
show_status
cleanup_dind
fi