Files
Server-scripts/docker_compose/debugging/debug_docker_container.sh
T

190 lines
4.2 KiB
Bash

#!/usr/bin/env bash
set -uo pipefail
CONTAINER="${1:-}"
COMPOSE_FILE="${2:-}"
if [ -z "$CONTAINER" ]; then
echo "Usage:"
echo " $0 <container-name> [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"