# ─── Stage 1: Build ──────────────────────────────────────────────────────────── # Собираем agent-worker binary из исходников gateway/ FROM golang:1.23-alpine AS builder WORKDIR /build # Кэшируем зависимости отдельным слоем COPY gateway/go.mod gateway/go.sum ./ RUN go mod download # Копируем исходники COPY gateway/ ./ # Собираем статически линкованный бинарь RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -trimpath -ldflags="-s -w" \ -o agent-worker \ ./cmd/agent-worker # ─── Stage 2: Runtime ────────────────────────────────────────────────────────── FROM alpine:3.21 # Runtime tools needed by the agent's tool executor: # bash — shell_exec uses bash -c (falls back to sh) # curl — http_request + docker socket API fallback in docker_exec # wget — healthcheck # jq — JSON processing in shell scripts # python3 — docker_exec socket fallback (docker ps via API) RUN apk add --no-cache \ ca-certificates \ tzdata \ bash \ curl \ wget \ jq \ python3 WORKDIR /app COPY --from=builder /build/agent-worker /app/agent-worker # Порт HTTP API агента (переопределяется через AGENT_PORT env) EXPOSE 8001 # ── Healthcheck ────────────────────────────────────────────────────────────── # Docker/Swarm будет проверять /health каждые 15 секунд HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \ CMD wget -qO- http://localhost:${AGENT_PORT:-8001}/health || exit 1 # Required env vars (подставляются при деплое Swarm service): # AGENT_ID — числовой ID агента из таблицы agents # DATABASE_URL — mysql://user:pass@host:3306/goclaw # LLM_BASE_URL — https://ollama.com/v1 или http://ollama:11434/v1 # LLM_API_KEY — ключ LLM провайдера # AGENT_PORT — порт HTTP (default: 8001) ENTRYPOINT ["/app/agent-worker"]