#!/usr/bin/env bash set -euo pipefail PROJECT_DIR="${PROJECT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}" ROOTLESS_RUNTIME_DIR="${ROOTLESS_RUNTIME_DIR:-$HOME/.docker/run}" DOCKER_SOCK="${DOCKER_SOCK:-$ROOTLESS_RUNTIME_DIR/docker.sock}" DOCKER_LOG="${DOCKER_LOG:-$HOME/.docker/dockerd-rootless.log}" ensure_docker() { mkdir -p "$ROOTLESS_RUNTIME_DIR" chmod 700 "$ROOTLESS_RUNTIME_DIR" if DOCKER_HOST="unix://$DOCKER_SOCK" docker info >/dev/null 2>&1; then return 0 fi if ! pgrep -u "$(id -u)" -f "dockerd-rootless.sh.*$DOCKER_SOCK" >/dev/null 2>&1; then : > "$DOCKER_LOG" setsid sh -c \ "export XDG_RUNTIME_DIR='$ROOTLESS_RUNTIME_DIR'; exec dockerd-rootless.sh --iptables=false --host=unix://$DOCKER_SOCK >> '$DOCKER_LOG' 2>&1" \ < /dev/null >/dev/null 2>&1 & fi for _ in $(seq 1 45); do if DOCKER_HOST="unix://$DOCKER_SOCK" docker info >/dev/null 2>&1; then return 0 fi sleep 1 done echo "Docker rootless daemon did not become ready. Last log lines:" >&2 tail -n 80 "$DOCKER_LOG" >&2 || true return 1 } compose() { ensure_docker export DOCKER_HOST="unix://$DOCKER_SOCK" cd "$PROJECT_DIR" docker compose "$@" } case "${1:-up}" in start) ensure_docker ;; up) compose up -d ;; build-up) compose up -d --build ;; ps) compose ps ;; logs) shift compose logs "${@:-api}" ;; down) compose down ;; health) curl -fsS http://127.0.0.1:${API_PORT:-8102}/v1/admin/health echo ;; *) echo "Usage: $0 {start|up|build-up|ps|logs [service]|down|health}" >&2 exit 2 ;; esac