# Orchestrator control-plane image (PRD 0070, #384). # # This is the **single definition of the orchestrator's content** — the # `bot_bottle` package baked onto a Python runtime — referenced by BOTH: # * the docker backend, which runs this image directly as the lean # control-plane container; and # * the firecracker infra image (Dockerfile.infra), which `COPY --from`s # this image's `/app/bot_bottle` so the single infra VM runs the same # control plane. Keeping it in one place means future orchestrator deps # (e.g. iroh) are added here once, not duplicated per backend. # # It stays deliberately lean: the control plane is **stdlib-only** today, so # no third-party payload — none of the gateway's mitmproxy/git/gitleaks # (that's Dockerfile.gateway) and no buildah (that's the firecracker # builder, and lives only in Dockerfile.infra). Keeping the secret-dense # control plane on a minimal dependency surface is the point (PRD 0070's # "secret concentration"). # # Shares the trixie `python:3.12-slim` base with the gateway image, so when # the orchestrator grows real deps they can be `COPY --from`'d into the # infra image cleanly (same base/python — installed packages copy safely). FROM python:3.12-slim WORKDIR /app # The orchestrator content. Baked so the image is self-contained (runs from # a built image, no runtime bind-mount); the docker backend may still # bind-mount /app for dev live-reload, which simply overlays this copy. # `.dockerignore` keeps .git/docs/*.md out of the context. (Future deps like # iroh go here too — a shared requirements installed on this same base.) COPY bot_bottle /app/bot_bottle # Documentation only; lifecycle.py overrides the entrypoint to # `python3 -m bot_bottle.orchestrator` with the runtime flags. ENTRYPOINT ["python3", "-m", "bot_bottle.orchestrator"]