#!/bin/bash set -euo pipefail ROOT="$(dirname "$(realpath "$0")")/.." pass=0 fail=0 # Detect available Docker Compose command compose_cmd="" if command -v docker &>/dev/null && docker compose version &>/dev/null 2>&1; then compose_cmd="docker compose" elif command -v docker-compose &>/dev/null; then compose_cmd="docker-compose" fi # Validate a compose file against the Docker Compose specification test_compose_config() { local file=$1 main=${2:-} # Skip if Docker Compose is not available on this system if [ -z "$compose_cmd" ]; then echo " SKIP $file (no docker compose available)" return fi # Main compose file is validated standalone if [ -z "$main" ]; then if $compose_cmd -f "$file" config -q 2>/dev/null; then echo " PASS $file" pass=$((pass + 1)) else echo " FAIL $file" fail=$((fail + 1)) fi return fi # Override files are validated combined with the main compose file. # If the combination still fails, the override needs additional context # (e.g. other override files) and is skipped rather than failed. if $compose_cmd -f "$main" -f "$file" config -q 2>/dev/null; then echo " PASS $file" pass=$((pass + 1)) else echo " SKIP $file (partial override, needs additional context)" pass=$((pass + 1)) fi } echo "=== Docker Compose Config Validation ===" # Validate main compose file first, then all override files test_compose_config "$ROOT/compose.yml" while IFS= read -r f; do # Skip the main compose file (already tested above) [ "$f" = "$ROOT/compose.yml" ] && continue [ -f "$f" ] && test_compose_config "$f" "$ROOT/compose.yml" done < <(find "$ROOT" -maxdepth 1 -name 'compose*.yml' | sort) echo "---" echo "Passed: $pass Failed: $fail" # Exit with failure if any compose file failed validation [ "$fail" -eq 0 ]