refactor(firecracker): drop the orphaned Dockerfile.infra intermediate
The orchestrator/gateway container split retired the docker backend's combined `bot-bottle-infra` container, leaving `Dockerfile.infra` used only as the base layer for the firecracker rootfs image — and its header still (falsely) claimed "used directly by the Docker backend." Fold its one `COPY --from orchestrator` into `Dockerfile.infra.fc` (now `FROM bot-bottle-gateway` directly + the copy + buildah), delete Dockerfile.infra, and drop the now-dead build step + artifact-version entry. `build_infra_images_with_docker` builds three images instead of four; the firecracker rootfs is unchanged in content (still gateway + orchestrator package + buildah, one artifact). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,22 +0,0 @@
|
|||||||
# Shared infra image: gateway data plane + orchestrator control plane.
|
|
||||||
#
|
|
||||||
# Used directly by the Docker backend (run as one `bot-bottle-infra`
|
|
||||||
# container, replacing the prior two-container split). The Firecracker
|
|
||||||
# backend extends this via Dockerfile.infra.fc, adding buildah/crun/
|
|
||||||
# netavark for in-VM agent-image building.
|
|
||||||
#
|
|
||||||
# Dockerfile.orchestrator is the single definition of the orchestrator
|
|
||||||
# content (the lean `bot_bottle` package on python:3.12-slim). Both this
|
|
||||||
# image and Dockerfile.infra.fc pull it in via `COPY --from`.
|
|
||||||
#
|
|
||||||
# multi-`FROM` can't union two bases (that's multi-stage, not multiple
|
|
||||||
# inheritance), so the orchestrator content is pulled in via `COPY --from`
|
|
||||||
# rather than a second base. Both images share the trixie `python:3.12-slim`
|
|
||||||
# base, so the copy is clean (same python; future installed deps copy too).
|
|
||||||
FROM bot-bottle-gateway:latest
|
|
||||||
|
|
||||||
# The orchestrator content, from its single definition. The gateway image
|
|
||||||
# already has the flat daemon modules under /app; this adds the full
|
|
||||||
# `bot_bottle` package so `python3 -m bot_bottle.orchestrator` resolves —
|
|
||||||
# used by gateway_init when BOT_BOTTLE_GATEWAY_DAEMONS includes `orchestrator`.
|
|
||||||
COPY --from=bot-bottle-orchestrator:latest /app/bot_bottle /app/bot_bottle
|
|
||||||
+23
-12
@@ -1,19 +1,30 @@
|
|||||||
# Firecracker infra VM image (PRD 0070 Stage B).
|
# Firecracker infra VM image (PRD 0070 Stage B).
|
||||||
#
|
#
|
||||||
# Extends the shared infra base (Dockerfile.infra: gateway + orchestrator
|
# The shared rootfs both firecracker infra VMs boot: the gateway data plane +
|
||||||
# control plane) with the in-VM agent-image builder. The Firecracker backend
|
# the orchestrator control plane + the in-VM agent-image builder. A `bb_role=`
|
||||||
# builds users' agent Dockerfiles *inside this VM* with buildah (rootless,
|
# kernel-cmdline arg selects which plane the guest init starts (see
|
||||||
# daemonless) instead of on the host — no host Docker daemon, no
|
# `infra_vm._infra_init`), so there is one artifact to build/publish/pull.
|
||||||
# root-equivalent `docker` group.
|
|
||||||
#
|
#
|
||||||
# Requires the trixie base from bot-bottle-gateway (buildah 1.39: bookworm's
|
# `Dockerfile.orchestrator` is the single definition of the orchestrator
|
||||||
# 1.28 can't parse Dockerfile heredocs that agent images use).
|
# content (the lean `bot_bottle` package on trixie `python:3.12-slim`); it's
|
||||||
|
# pulled in via `COPY --from` (multi-`FROM` can't union two bases). Both images
|
||||||
|
# share the trixie base, so the copy is clean.
|
||||||
#
|
#
|
||||||
# `crun` is the OCI runtime; `netavark` + `aardvark-dns` are the network
|
# The Firecracker backend builds users' agent Dockerfiles *inside the
|
||||||
# backend for `FROM` pulls + `RUN` egress. `vfs` + `chroot`: buildah works
|
# orchestrator VM* with buildah (rootless, daemonless) instead of on the host —
|
||||||
# as root in the bare microVM (no fuse-overlayfs / overlay module / subuid
|
# no host Docker daemon, no root-equivalent `docker` group. Requires the trixie
|
||||||
# maps). Matches image_builder.
|
# base from bot-bottle-gateway (buildah 1.39: bookworm's 1.28 can't parse the
|
||||||
FROM bot-bottle-infra:latest
|
# Dockerfile heredocs agent images use). `crun` is the OCI runtime; `netavark` +
|
||||||
|
# `aardvark-dns` are the network backend for `FROM` pulls + `RUN` egress. `vfs` +
|
||||||
|
# `chroot`: buildah works as root in the bare microVM (no fuse-overlayfs /
|
||||||
|
# overlay module / subuid maps). Matches image_builder.
|
||||||
|
FROM bot-bottle-gateway:latest
|
||||||
|
|
||||||
|
# The orchestrator content, from its single definition. The gateway image
|
||||||
|
# already has the flat daemon modules under /app; this adds the full
|
||||||
|
# `bot_bottle` package so `python3 -m bot_bottle.orchestrator` resolves in the
|
||||||
|
# orchestrator-role VM.
|
||||||
|
COPY --from=bot-bottle-orchestrator:latest /app/bot_bottle /app/bot_bottle
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends \
|
&& apt-get install -y --no-install-recommends \
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ from . import util
|
|||||||
_ARTIFACT_FORMAT = "1"
|
_ARTIFACT_FORMAT = "1"
|
||||||
|
|
||||||
_REPO_ROOT = Path(__file__).resolve().parents[3]
|
_REPO_ROOT = Path(__file__).resolve().parents[3]
|
||||||
_DOCKERFILES = ("Dockerfile.orchestrator", "Dockerfile.gateway", "Dockerfile.infra", "Dockerfile.infra.fc")
|
_DOCKERFILES = ("Dockerfile.orchestrator", "Dockerfile.gateway", "Dockerfile.infra.fc")
|
||||||
|
|
||||||
_DEFAULT_BASE = "https://gitea.dideric.is"
|
_DEFAULT_BASE = "https://gitea.dideric.is"
|
||||||
_DEFAULT_OWNER = "didericis"
|
_DEFAULT_OWNER = "didericis"
|
||||||
|
|||||||
@@ -61,9 +61,10 @@ _GUEST_SIGNING_KEY_PATH = "/var/lib/bot-bottle/orchestrator-token"
|
|||||||
# the gateway daemons present it to the orchestrator, and never see the key.
|
# the gateway daemons present it to the orchestrator, and never see the key.
|
||||||
_GUEST_GATEWAY_JWT_PATH = "/var/lib/bot-bottle/gateway-jwt"
|
_GUEST_GATEWAY_JWT_PATH = "/var/lib/bot-bottle/gateway-jwt"
|
||||||
|
|
||||||
# The single shared infra image: gateway data plane + baked control-plane
|
# The single shared infra image: gateway data plane + COPY'd control-plane
|
||||||
# source + buildah (Dockerfile.infra.fc). Built from source by default; a
|
# `bot_bottle` package + buildah (Dockerfile.infra.fc, FROM gateway). Built from
|
||||||
# pull-from-registry mode lands later. Both VMs boot from it.
|
# source by default; a pull-from-registry mode lands later. Both VMs boot from
|
||||||
|
# it, the `bb_role` cmdline selecting the plane.
|
||||||
_INFRA_IMAGE = "bot-bottle-infra:latest"
|
_INFRA_IMAGE = "bot-bottle-infra:latest"
|
||||||
_GATEWAY_IMAGE = "bot-bottle-gateway:latest"
|
_GATEWAY_IMAGE = "bot-bottle-gateway:latest"
|
||||||
_ORCHESTRATOR_IMAGE = "bot-bottle-orchestrator:latest"
|
_ORCHESTRATOR_IMAGE = "bot-bottle-orchestrator:latest"
|
||||||
@@ -124,9 +125,9 @@ def ensure_built() -> None:
|
|||||||
Default (docker-free, PRD 0069 Stage 2): download + verify the prebuilt
|
Default (docker-free, PRD 0069 Stage 2): download + verify the prebuilt
|
||||||
rootfs artifact matching this code version (see `infra_artifact`); the
|
rootfs artifact matching this code version (see `infra_artifact`); the
|
||||||
launch host needs no Docker. `BOT_BOTTLE_INFRA_BUILD=local` instead builds
|
launch host needs no Docker. `BOT_BOTTLE_INFRA_BUILD=local` instead builds
|
||||||
the fixed images from source with host Docker — the infra image
|
the fixed images from source with host Docker — the infra image is `FROM`
|
||||||
`COPY --from`s the orchestrator image and is `FROM` the gateway image, so
|
the gateway image and `COPY --from`s the orchestrator image, so both must
|
||||||
both must exist first — for iterating on the Dockerfiles."""
|
exist first — for iterating on the Dockerfiles."""
|
||||||
if infra_artifact.local_build_requested():
|
if infra_artifact.local_build_requested():
|
||||||
build_infra_images_with_docker()
|
build_infra_images_with_docker()
|
||||||
return
|
return
|
||||||
@@ -135,17 +136,15 @@ def ensure_built() -> None:
|
|||||||
|
|
||||||
|
|
||||||
def build_infra_images_with_docker() -> None:
|
def build_infra_images_with_docker() -> None:
|
||||||
"""Build the four fixed images from source with host Docker: orchestrator,
|
"""Build the three fixed images from source with host Docker: orchestrator,
|
||||||
gateway, the shared infra base (Dockerfile.infra), then the Firecracker
|
gateway, then the Firecracker infra image (Dockerfile.infra.fc: FROM gateway
|
||||||
infra image (Dockerfile.infra.fc: FROM infra + buildah). The launch host
|
+ COPY --from orchestrator + buildah). The launch host uses this only in
|
||||||
uses this only in `BOT_BOTTLE_INFRA_BUILD=local` mode; `publish_infra`
|
`BOT_BOTTLE_INFRA_BUILD=local` mode; `publish_infra` uses it off-host to
|
||||||
uses it off-host to produce the published artifact."""
|
produce the published artifact."""
|
||||||
docker_mod.build_image(
|
docker_mod.build_image(
|
||||||
_ORCHESTRATOR_IMAGE, str(_REPO_ROOT), dockerfile="Dockerfile.orchestrator")
|
_ORCHESTRATOR_IMAGE, str(_REPO_ROOT), dockerfile="Dockerfile.orchestrator")
|
||||||
docker_mod.build_image(
|
docker_mod.build_image(
|
||||||
_GATEWAY_IMAGE, str(_REPO_ROOT), dockerfile="Dockerfile.gateway")
|
_GATEWAY_IMAGE, str(_REPO_ROOT), dockerfile="Dockerfile.gateway")
|
||||||
docker_mod.build_image(
|
|
||||||
"bot-bottle-infra:latest", str(_REPO_ROOT), dockerfile="Dockerfile.infra")
|
|
||||||
docker_mod.build_image(
|
docker_mod.build_image(
|
||||||
_INFRA_IMAGE, str(_REPO_ROOT), dockerfile="Dockerfile.infra.fc")
|
_INFRA_IMAGE, str(_REPO_ROOT), dockerfile="Dockerfile.infra.fc")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user