#!/usr/bin/env bash # docker-clean.sh - Interactive Docker cleanup for the ByteLyst platform prototype. set -euo pipefail RED=$'\033[0;31m' GREEN=$'\033[0;32m' YELLOW=$'\033[1;33m' CYAN=$'\033[0;36m' BOLD=$'\033[1m' DIM=$'\033[2m' NC=$'\033[0m' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" log() { echo -e "${CYAN}[docker-clean]${NC} $*"; } ok() { echo -e "${GREEN}OK:${NC} $*"; } warn() { echo -e "${YELLOW}WARN:${NC} $*"; } err() { echo -e "${RED}ERROR:${NC} $*" >&2; } require_docker() { if ! command -v docker >/dev/null 2>&1; then err "Docker CLI is not installed or not on PATH." exit 1 fi if ! docker info >/dev/null 2>&1; then err "Docker daemon is not reachable. Start Docker Desktop or your Docker daemon and try again." exit 1 fi if ! docker compose version >/dev/null 2>&1; then err "Docker Compose plugin is not available. Install/update Docker Desktop or the docker compose plugin." exit 1 fi } run_cmd() { echo -e "${DIM}$*${NC}" "$@" } confirm() { local prompt="$1" read -r -p "$(echo -e "${BOLD}${prompt}${NC} [y/N] ")" answer case "${answer:-}" in y|Y|yes|YES) return 0 ;; * ) return 1 ;; esac } compose_status() { log "Compose services in $REPO_ROOT" cd "$REPO_ROOT" run_cmd docker compose ps echo "" log "Docker disk usage" run_cmd docker system df } stop_compose() { log "Stopping compose services" cd "$REPO_ROOT" run_cmd docker compose stop } down_compose() { log "Removing compose containers and networks" cd "$REPO_ROOT" run_cmd docker compose down --remove-orphans } down_compose_with_volumes() { cd "$REPO_ROOT" run_cmd docker compose down --remove-orphans --volumes } safe_prune() { log "Pruning stopped containers, unused networks, dangling images, and build cache" run_cmd docker container prune --force run_cmd docker network prune --force run_cmd docker image prune --force run_cmd docker builder prune --force } unused_image_prune() { run_cmd docker image prune --all --force run_cmd docker builder prune --all --force } full_prune() { run_cmd docker system prune --all --volumes --force } builder_prune() { log "Pruning Docker builder cache" run_cmd docker builder prune --all --force } show_menu() { cat <