# syntax=docker/dockerfile:1 # ── Build stage ─────────────────────────────────────────────────────────────── FROM golang:1.26-bookworm AS builder ARG VERSION=dev WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -trimpath -ldflags="-s -w -X main.version=${VERSION}" \ -o /out/supervisor ./cmd/supervisor # ── Runtime stage ───────────────────────────────────────────────────────────── # Node.js 22 slim — needed for claude CLI subprocess FROM node:22-slim # Install claude CLI (provides the `claude` binary the supervisor shells out to) RUN npm install -g @anthropic-ai/claude-code \ && claude --version \ && echo "claude CLI installed" # Copy supervisor binary COPY --from=builder /out/supervisor /usr/local/bin/supervisor # Bake in config (models.yaml + skill discipline files) COPY config/ /app/config/ # Run as non-root RUN groupadd -r supervisor && useradd -r -g supervisor -d /app supervisor WORKDIR /app # brain/ is writable state — mount a PersistentVolume here VOLUME /app/brain ENV SUPERVISOR_CONFIG_DIR=/app/config/supervisor ENV SUPERVISOR_MODELS_FILE=/app/config/models.yaml ENV SUPERVISOR_BRAIN_DIR=/app/brain ENV SUPERVISOR_SESSIONS_DIR=/app/brain/sessions ENV SUPERVISOR_PORT=3200 USER supervisor EXPOSE 3200 ENTRYPOINT ["/usr/local/bin/supervisor"]