agent-proxy: validate a real docker build boots + serves (fix container had no daemon) #24
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Follow-up flagged in the agent-proxy#22 retrospective. That fix corrected the dependency metadata and validated the exact
uv sync --frozen --no-devinstall path the Dockerfile uses, but it could not run an actualdocker build(no docker daemon in the fix container). The image build was the thing that was broken, so it should be exercised end to end at least once.Ask
Run a real
docker buildof the agent-proxy image frommainand confirm it boots and serves, not just that the deps resolve:docker build -t agent-proxy-test .completes clean.docker runthe image and confirmpython -m app.mainbinds without aModuleNotFoundErrorand stays up (no restart loop)./v1/healthz,/v1/models, and/metricsagainst the running container and confirm they respond.If any of that fails, fix the Dockerfile/entrypoint until it passes.
test-container.shalready stubs the build check - extend it (or add a small script) so this is repeatable, and wire it into the repo's test verb if that fits the house style.Acceptance
test-container.sh(or its replacement) actually asserts a bootable container, not just a successful build.Refs
--buildon converge, so a broken build would now surface on Kai's nextward exec ansible-sync- this makes it catchable in the repo instead.🔒 Reserved by
ward agent --driver claude— containerengineer-claude-agent-proxy-24on hostkais-macbook-pro-2.localis carrying this issue (reserved 2026-07-02T08:24:04Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.— Claude (she/her), via
ward agentWARD-OUTCOME: done - test-container.sh now builds+boots+serves the image (daemon path), plus a daemonless boot_probe.sh, both landed on main and #24 closed.
Honest retro: the ironic part is this fix container also had no Docker daemon - and no way to get one (no root, no
uidmap/iptables, rootless setup refused). So I couldn't press the actualdocker buildbutton myself, which is the one thing the issue most wanted. What I could do was validate the thing that actually matters: I reproduced the Dockerfile's exact install path (uv sync --frozen --no-dev) and CMD (.venv/bin/python -m app.main), booted it, and confirmed/healthz+/v1/models+/metricsall respond and the process stays up. That runs green here and is nowward boot-probe. The daemon-requiringward test-containeris written and bash-checked but has NOT been executed against a real daemon from this box - infrastructure#431's--build-on-converge is what will exercise it for real on Kai's next ansible-sync.One surprise worth flagging: the issue says probe
/v1/healthz, butapp.mainregisters healthz at/healthz(unprefixed), so that's what I assert - noted inline in the probe script. Confidence is high on the boot logic and the daemonless proof; medium on the docker path purely because I couldn't run it end to end here. A mid-rungit fetchalso caught issue-25 landing pytest-asyncio, which I merged cleanly (async tests now run: 27 passed).Follow-up worth filing: give the engineer container a real (or rootless-capable) Docker daemon, or wire
ward test-containerinto a CI leg that has one, so the daemon path gets asserted in-repo rather than only on ansible converge.Scoping note: the live
docker build+ boot half of this is blocked on ward#522 - engineer containers currently have no usable docker daemon (the host socket is mounted only for the dispatch path, not detached engineer runs, and dev-base ships no docker CLI). ward#522 is designing that capability (docker-out-of-docker vs true DinD vs rootless/sysbox, reconciled with SECURITY.md's socket-as-escape-vector note).So scope this run to the daemon-free part, which stands alone and is useful now:
test-container.sh(or a replacement) a real, repeatable build+boot+healthz/models/metrics check, ready to run wherever a daemon exists.uv sync --frozen --no-devinstall path resolves cleanly.Leave the actual live
docker buildexecution as the acceptance step that unblocks once ward#522 lands - do not block or salvage this run waiting on a daemon. Note in the outcome that live-build verification is deferred to ward#522.