#!/usr/bin/env bash set -euo pipefail source "$(dirname "$0")/../lib/common.sh" 2>/dev/null || source "$(dirname "$0")/common.sh" usage() { cat </dev/null; then echo "docker not found" exit 1 fi if ! container_ids=$(docker ps -a -q 2>/dev/null) || [[ -z "$container_ids" ]]; then echo "No containers." exit 0 fi healthy=0 unhealthy=0 no_check=0 other=0 echo "── Docker Health ─────────────────────────────────" for cid in $container_ids; do info=$(docker inspect "$cid" 2>/dev/null) || continue name=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['Name'].lstrip('/'))" 2>/dev/null) health=$(echo "$info" | python3 -c " import sys,json d=json.load(sys.stdin)[0] h=d.get('State',{}).get('Health',{}) print(h.get('Status','') if h else '') " 2>/dev/null || true) started_at=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['State']['StartedAt'])" 2>/dev/null) status=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['State']['Status'])" 2>/dev/null) # Calculate uptime uptime="-" if start_ts=$(date -d "$started_at" +%s 2>/dev/null); then now_ts=$(date +%s) diff=$((now_ts - start_ts)) days=$((diff / 86400)) hours=$(((diff % 86400) / 3600)) mins=$(((diff % 3600) / 60)) if [ "$days" -gt 0 ]; then uptime="${days}d ${hours}h" elif [ "$hours" -gt 0 ]; then uptime="${hours}h ${mins}m" else uptime="${mins}m" fi fi # Determine health display if [ -n "$health" ]; then case "$health" in healthy) health_display="${GREEN}healthy${RESET}" healthy=$((healthy + 1)) ;; unhealthy) health_display="${RED}unhealthy${RESET}" unhealthy=$((unhealthy + 1)) ;; starting) health_display="${YELLOW}starting${RESET}" other=$((other + 1)) ;; *) health_display="${YELLOW}${health}${RESET}" other=$((other + 1)) ;; esac elif [ "$status" != "running" ]; then health_display="${RED}${status}${RESET}" other=$((other + 1)) else health_display="${YELLOW}no healthcheck${RESET}" no_check=$((no_check + 1)) fi printf " %-24s %b%-20s${RESET} %s\n" "$name" "" "$health_display" "$uptime" done total=$((healthy + unhealthy + no_check + other)) echo "──────────────────────────────────────────────────" echo " Total: $total ${GREEN}healthy: $healthy${RESET} ${RED}unhealthy: $unhealthy${RESET} no check: $no_check" if [ "$unhealthy" -gt 0 ]; then echo echo "${RED}Unhealthy containers detected${RESET}" exit 1 fi