#!/usr/bin/env bash set -uo pipefail CONTAINER="${1:-}" COMPOSE_FILE="${2:-}" if [ -z "$CONTAINER" ]; then echo "Usage:" echo " $0 [docker-compose.yml]" exit 1 fi TIMESTAMP=$(date +%Y%m%d-%H%M%S) OUTDIR="/tmp/${CONTAINER}-debug-${TIMESTAMP}" mkdir -p "$OUTDIR" echo "[*] Collecting debug data for container: $CONTAINER" # -------------------------------------------------- # Docker info # -------------------------------------------------- docker inspect "$CONTAINER" \ > "$OUTDIR/docker-inspect.json" 2>&1 || true docker inspect "$CONTAINER" --format '{{.Config.Image}}' \ > "$OUTDIR/image.txt" 2>&1 || true # -------------------------------------------------- # Logs # -------------------------------------------------- docker logs "$CONTAINER" --tail=10000 \ > "$OUTDIR/container.log" 2>&1 || true # -------------------------------------------------- # Environment # -------------------------------------------------- docker exec "$CONTAINER" env \ > "$OUTDIR/container-env.txt" 2>&1 || true # -------------------------------------------------- # Host information # -------------------------------------------------- { echo "=== HOST ===" if command -v lsb_release >/dev/null 2>&1; then lsb_release -a fi uname -a echo echo "=== DOCKER ===" docker --version } > "$OUTDIR/host.txt" 2>&1 PROGRAMS=( "yt-dlp" "ffmpeg" "ffprobe" "node" "npm" "python" "python3" "java" "curl" "wget" "git" ) # -------------------------------------------------- # Common program versions # -------------------------------------------------- { echo "=== PROGRAM VERSIONS ===" echo for prog in "${PROGRAMS[@]}"; do echo "----- $prog -----" if docker exec "$CONTAINER" sh -c "command -v '$prog'" \ >/dev/null 2>&1; then docker exec "$CONTAINER" sh -c " $prog --version 2>/dev/null || $prog -version 2>/dev/null || $prog -V 2>/dev/null || true " | head -n 5 else echo "not installed" fi echo done } > "$OUTDIR/versions.txt" 2>&1 # -------------------------------------------------- # Compose snippet # -------------------------------------------------- if [ -n "$COMPOSE_FILE" ] && [ -f "$COMPOSE_FILE" ]; then SERVICE=$(docker inspect "$CONTAINER" \ --format '{{ index .Config.Labels "com.docker.compose.service" }}' \ 2>/dev/null) if [ -n "$SERVICE" ]; then yq ".services.\"$SERVICE\"" "$COMPOSE_FILE" \ > "$OUTDIR/compose-service.yaml" 2>&1 || true fi fi # -------------------------------------------------- # Summary # -------------------------------------------------- { echo "=================================" echo "Debug Summary" echo "=================================" echo echo "Container:" echo " $CONTAINER" echo echo "Image:" cat "$OUTDIR/image.txt" 2>/dev/null echo echo "Host:" uname -a lsb_release -a docker --version echo echo "Compose Service:" docker inspect "$CONTAINER" \ --format '{{ index .Config.Labels "com.docker.compose.service" }}' \ 2>/dev/null || echo "unknown" if [ -n "$SERVICE" ]; then echo "Docker Compose Config" yq ".services.\"$SERVICE\"" "$COMPOSE_FILE" fi echo echo "Programs found:" for prog in "${PROGRAMS[@]}"; do if docker exec "$CONTAINER" sh -c "command -v '$prog'" \ >/dev/null 2>&1; then echo "$prog: $( $prog --version 2>/dev/null || $prog -version 2>/dev/null || $prog -V 2>/dev/null || true )" | head -n1 fi done } | tee "$OUTDIR/summary.txt" # -------------------------------------------------- # Archive # -------------------------------------------------- ARCHIVE="${OUTDIR}.tar.gz" tar czf "$ARCHIVE" \ -C "$(dirname "$OUTDIR")" \ "$(basename "$OUTDIR")" echo echo "[OK] Debug report created:" echo "$ARCHIVE" echo ls -lh "$ARCHIVE"