gitoriaLog in with ident

antcolony

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit7f9660ee7f9660eeState of 2026-09-27, before the move to gitoriamre7f9660ee/docker/entrypoint.sh

4.3 KB

  1. #!/bin/bash
  2. # docker/entrypoint.sh — mission 028 (ticket antcolony#1): the container's main process, started by docker/pivot.sh
  3. # INSIDE the host's filesystem as uid 1000 (mre). Runs `./colony run [--live] [$COLONY_RUN_ARGS]` with mre's login
  4. # environment, tees every line to `docker logs` (stdout) AND a rotating file log, and maps docker's ONE stop signal
  5. # onto the colony wrapper's two-signal logic:
  6. # docker stop (SIGTERM) → 1st TERM to the wrapper = "finish" (nothing new starts; idle → stops at once)
  7. # → after COLONY_STOP_FINISH_SECONDS (20) still running → 2nd TERM = "park" (sessions killed +
  8. # parked, resumed by the next start) → exit. docker-compose.yml stop_grace_period (75 s) must
  9. # cover finish window + park; a 2nd SIGTERM here parks at once.
  10. set -u
  11. if [ "$(id -u)" = 0 ]; then echo "entrypoint: REFUSED — running as root (the scheduler and its workers run as uid 1000)"; exit 1; fi
  12. here="$(cd "$(dirname "$0")/.." && pwd)"
  13. # the host user's login environment (the same toolchain as a login shell of mre on the host)
  14. HOME="$(getent passwd "$(id -u)" | cut -d: -f6)"
  15. USER="$(id -un)"
  16. export HOME USER LOGNAME="$USER" SHELL=/bin/bash
  17. export PATH="$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"
  18. if [ -r /etc/locale.conf ]; then set -a; . /etc/locale.conf; set +a; fi
  19. cd "$here" || exit 1
  20. # empty settings (compose writes VAR= for "not set") are unset, so the scheduler's own defaults apply
  21. for v in ${!COLONY_@}; do [ -z "${!v}" ] && unset "$v"; done
  22. export COLONY_TOKEN_FILE="${COLONY_TOKEN_FILE:-$HOME/.config/antcolony/tickets-token}"
  23. # CLAUDE_CONFIG_DIR: empty → unset (claude uses ~/.claude, the host login); set → the workers log in with that folder's account
  24. if [ -z "${CLAUDE_CONFIG_DIR:-}" ]; then unset CLAUDE_CONFIG_DIR; else export CLAUDE_CONFIG_DIR; fi
  25. log_dir="${COLONY_LOG_DIR:-$here/logs}"
  26. log_max="${COLONY_LOG_MAX_BYTES:-10485760}"
  27. log_keep="${COLONY_LOG_KEEP:-5}"
  28. finish_s="${COLONY_STOP_FINISH_SECONDS:-20}"
  29. case "$log_max$log_keep$finish_s" in *[!0-9]*) echo "entrypoint: REFUSED — COLONY_LOG_MAX_BYTES / COLONY_LOG_KEEP / COLONY_STOP_FINISH_SECONDS must be whole numbers"; exit 1;; esac
  30. [ "$log_keep" -ge 1 ] || log_keep=1
  31. mkdir -p "$log_dir"
  32. log="$log_dir/colony.log"
  33. # file log: <UTC time> <line>, rotated at COLONY_LOG_MAX_BYTES into colony.log.1 … .COLONY_LOG_KEEP (oldest dropped)
  34. rotate() {
  35. local i
  36. rm -f "$log.$log_keep"
  37. for ((i = log_keep - 1; i >= 1; i--)); do [ -e "$log.$i" ] && mv -f "$log.$i" "$log.$((i + 1))"; done
  38. mv -f "$log" "$log.1"
  39. }
  40. logger() {
  41. local LC_ALL=C line stamped size
  42. size=$(stat -c %s "$log" 2>/dev/null || echo 0)
  43. while IFS= read -r line; do
  44. printf '%s\n' "$line"
  45. stamped="$(date -u +%Y-%m-%dT%H:%M:%SZ) $line"
  46. printf '%s\n' "$stamped" >> "$log"
  47. size=$((size + ${#stamped} + 1))
  48. if [ "$size" -ge "$log_max" ]; then rotate; size=0; fi
  49. done
  50. }
  51. exec > >(logger) 2>&1
  52. logger_pid=$!
  53. args=(run)
  54. case "${COLONY_LIVE:-0}" in 1|yes|true) args+=(--live);; esac
  55. if [ -n "${COLONY_RUN_ARGS:-}" ]; then read -r -a extra <<< "$COLONY_RUN_ARGS"; args+=("${extra[@]}"); fi
  56. settings=""
  57. for v in $(compgen -v COLONY_ | sort); do settings="$settings $v=${!v}"; done
  58. echo "entrypoint: $(date -u +%Y-%m-%dT%H:%M:%SZ) uid $(id -u) ($USER) on $(cat /etc/hostname), pid $$ → ./colony ${args[*]}"
  59. echo "entrypoint: settings:$settings"
  60. echo "entrypoint: file log $log (rotates at $log_max bytes, keeps $log_keep); docker stop → finish, park after ${finish_s}s"
  61. pid=""
  62. timer=""
  63. signals=0
  64. on_stop() {
  65. signals=$((signals + 1))
  66. [ -n "$pid" ] || exit 0
  67. if [ "$signals" -eq 1 ]; then
  68. echo "entrypoint: stop signal → finish (nothing new starts); park after ${finish_s}s if a session still runs"
  69. kill -TERM "$pid" 2>/dev/null
  70. ( sleep "$finish_s" < /dev/null > /dev/null 2>&1
  71. if kill -0 "$pid" 2>/dev/null; then echo "entrypoint: ${finish_s}s over → park"; kill -TERM "$pid" 2>/dev/null; fi ) &
  72. timer=$!
  73. else
  74. echo "entrypoint: stop signal $signals → park now"
  75. kill -TERM "$pid" 2>/dev/null
  76. fi
  77. }
  78. trap on_stop TERM INT
  79. "$here/colony" "${args[@]}" < /dev/null &
  80. pid=$!
  81. while kill -0 "$pid" 2>/dev/null; do wait "$pid"; done
  82. wait "$pid"; rc=$?
  83. [ -n "$timer" ] && kill "$timer" 2>/dev/null
  84. echo "entrypoint: $(date -u +%Y-%m-%dT%H:%M:%SZ) ./colony run ended (status $rc)"
  85. exec > /dev/null 2>&1
  86. wait "$logger_pid"
  87. exit "$rc"

Branches

Latest commits

  • 7f9660eeState of 2026-09-27, before the move to gitoriamre