antcolony
All repositories: gitoria
4.3 KB
#!/bin/bash# docker/entrypoint.sh — mission 028 (ticket antcolony#1): the container's main process, started by docker/pivot.sh# INSIDE the host's filesystem as uid 1000 (mre). Runs `./colony run [--live] [$COLONY_RUN_ARGS]` with mre's login# environment, tees every line to `docker logs` (stdout) AND a rotating file log, and maps docker's ONE stop signal# onto the colony wrapper's two-signal logic:# docker stop (SIGTERM) → 1st TERM to the wrapper = "finish" (nothing new starts; idle → stops at once)# → after COLONY_STOP_FINISH_SECONDS (20) still running → 2nd TERM = "park" (sessions killed +# parked, resumed by the next start) → exit. docker-compose.yml stop_grace_period (75 s) must# cover finish window + park; a 2nd SIGTERM here parks at once.set -uif [ "$(id -u)" = 0 ]; then echo "entrypoint: REFUSED — running as root (the scheduler and its workers run as uid 1000)"; exit 1; fihere="$(cd "$(dirname "$0")/.." && pwd)"# the host user's login environment (the same toolchain as a login shell of mre on the host)HOME="$(getent passwd "$(id -u)" | cut -d: -f6)"USER="$(id -un)"export HOME USER LOGNAME="$USER" SHELL=/bin/bashexport PATH="$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"if [ -r /etc/locale.conf ]; then set -a; . /etc/locale.conf; set +a; ficd "$here" || exit 1# empty settings (compose writes VAR= for "not set") are unset, so the scheduler's own defaults applyfor v in ${!COLONY_@}; do [ -z "${!v}" ] && unset "$v"; doneexport COLONY_TOKEN_FILE="${COLONY_TOKEN_FILE:-$HOME/.config/antcolony/tickets-token}"# CLAUDE_CONFIG_DIR: empty → unset (claude uses ~/.claude, the host login); set → the workers log in with that folder's accountif [ -z "${CLAUDE_CONFIG_DIR:-}" ]; then unset CLAUDE_CONFIG_DIR; else export CLAUDE_CONFIG_DIR; filog_dir="${COLONY_LOG_DIR:-$here/logs}"log_max="${COLONY_LOG_MAX_BYTES:-10485760}"log_keep="${COLONY_LOG_KEEP:-5}"finish_s="${COLONY_STOP_FINISH_SECONDS:-20}"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[ "$log_keep" -ge 1 ] || log_keep=1mkdir -p "$log_dir"log="$log_dir/colony.log"# file log: <UTC time> <line>, rotated at COLONY_LOG_MAX_BYTES into colony.log.1 … .COLONY_LOG_KEEP (oldest dropped)rotate() {local irm -f "$log.$log_keep"for ((i = log_keep - 1; i >= 1; i--)); do [ -e "$log.$i" ] && mv -f "$log.$i" "$log.$((i + 1))"; donemv -f "$log" "$log.1"}logger() {local LC_ALL=C line stamped sizesize=$(stat -c %s "$log" 2>/dev/null || echo 0)while IFS= read -r line; doprintf '%s\n' "$line"stamped="$(date -u +%Y-%m-%dT%H:%M:%SZ) $line"printf '%s\n' "$stamped" >> "$log"size=$((size + ${#stamped} + 1))if [ "$size" -ge "$log_max" ]; then rotate; size=0; fidone}exec > >(logger) 2>&1logger_pid=$!args=(run)case "${COLONY_LIVE:-0}" in 1|yes|true) args+=(--live);; esacif [ -n "${COLONY_RUN_ARGS:-}" ]; then read -r -a extra <<< "$COLONY_RUN_ARGS"; args+=("${extra[@]}"); fisettings=""for v in $(compgen -v COLONY_ | sort); do settings="$settings $v=${!v}"; doneecho "entrypoint: $(date -u +%Y-%m-%dT%H:%M:%SZ) uid $(id -u) ($USER) on $(cat /etc/hostname), pid $$ → ./colony ${args[*]}"echo "entrypoint: settings:$settings"echo "entrypoint: file log $log (rotates at $log_max bytes, keeps $log_keep); docker stop → finish, park after ${finish_s}s"pid=""timer=""signals=0on_stop() {signals=$((signals + 1))[ -n "$pid" ] || exit 0if [ "$signals" -eq 1 ]; thenecho "entrypoint: stop signal → finish (nothing new starts); park after ${finish_s}s if a session still runs"kill -TERM "$pid" 2>/dev/null( sleep "$finish_s" < /dev/null > /dev/null 2>&1if kill -0 "$pid" 2>/dev/null; then echo "entrypoint: ${finish_s}s over → park"; kill -TERM "$pid" 2>/dev/null; fi ) &timer=$!elseecho "entrypoint: stop signal $signals → park now"kill -TERM "$pid" 2>/dev/nullfi}trap on_stop TERM INT"$here/colony" "${args[@]}" < /dev/null &pid=$!while kill -0 "$pid" 2>/dev/null; do wait "$pid"; donewait "$pid"; rc=$?[ -n "$timer" ] && kill "$timer" 2>/dev/nullecho "entrypoint: $(date -u +%Y-%m-%dT%H:%M:%SZ) ./colony run ended (status $rc)"exec > /dev/null 2>&1wait "$logger_pid"exit "$rc"
Branches
- mainmain branch
Latest commits
- 7f9660eeState of 2026-09-27, before the move to gitoriamre