# 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 orchestrator VM image (Dockerfile.orchestrator.fc), # which is `FROM` this image and adds buildah for in-VM agent builds. # Keeping the content in one place means future orchestrator deps (e.g. # iroh) are added here once, not duplicated per backend. # # It stays deliberately lean: only the pinned FastAPI/Uvicorn control-plane # stack is installed here — none of the gateway's mitmproxy/git/gitleaks # (that's Dockerfile.gateway) and no buildah (that's firecracker-only). # # Shares an exact multi-architecture Python/trixie manifest with the gateway # image. The version-qualified tag keeps the human-readable upstream version; # the digest makes the bytes immutable. ARG PYTHON_BASE_IMAGE FROM ${PYTHON_BASE_IMAGE} WORKDIR /app COPY requirements.orchestrator.lock /tmp/requirements.orchestrator.lock RUN pip install --no-cache-dir --require-hashes \ -r /tmp/requirements.orchestrator.lock \ && rm /tmp/requirements.orchestrator.lock # 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"]