#!/usr/bin/env bash # Ensure Docker daemon is reachable on WSL host runner (Docker Desktop integration). # Usage: ensure-docker-daemon.sh [max_wait_seconds] set -euo pipefail MAX_WAIT="${1:-240}" INTERVAL=5 DEADLINE=$((SECONDS + MAX_WAIT)) docker_ok() { timeout 8 docker info >/dev/null 2>&1 } find_docker_host() { local candidates=( "${DOCKER_HOST:-}" "unix:///var/run/docker.sock" "unix:///mnt/wsl/docker-desktop/shared-sockets/guest-services/docker.sock" "unix:///mnt/wsl/docker-desktop/shared-sockets/guest-services/docker.proxy.sock" "unix:///mnt/wsl/docker-desktop/shared-sockets/guest-services/docker.container-proxy.sock" ) local host path for host in "${candidates[@]}"; do [[ -n "${host}" ]] || continue path="${host#unix://}" if [[ -S "${path}" ]] && DOCKER_HOST="${host}" docker_ok; then export DOCKER_HOST="${host}" echo "Docker ready (${host})" return 0 fi done if docker_ok; then echo "Docker ready (default socket)" return 0 fi return 1 } start_docker_desktop() { local exe="/mnt/c/Program Files/Docker/Docker/Docker Desktop.exe" if [[ -f "${exe}" ]]; then echo "Starting Docker Desktop..." powershell.exe -NoProfile -Command "Start-Process 'C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe'" >/dev/null 2>&1 || true return 0 fi echo "Docker Desktop executable not found" return 1 } attempt=0 while (( SECONDS < DEADLINE )); do attempt=$((attempt + 1)) if find_docker_host; then exit 0 fi if (( attempt == 1 || attempt == 7 )); then start_docker_desktop || true fi echo "waiting for docker (${attempt}, $((DEADLINE - SECONDS))s left)..." sleep "${INTERVAL}" done echo "Docker daemon not available after ${MAX_WAIT}s" echo "Hint: start Docker Desktop on Windows and enable WSL integration." exit 1