The docker / docker smoke-test job hung on homelab-runner-03: it booted the container fine (uid check passed) but then blocked probing the server over the network.
Root cause: the self-hosted runner executes each job step in a container that shares the host's Docker socket but sits on a different network. So the step can reach neither:
a published host port (docker run -p 18080:8080 lands the port on the runner host, not this step's netns), nor
the server container's bridge IP (different network → curl connect hangs, which is why the job looked stuck rather than failing fast).
Fix: probe from inside the server container with docker exec. It goes through the Docker socket and runs in the server's own netns, where 127.0.0.1:8080 always works regardless of runner topology. The image already ships python + httpx, so no curl or extra image pull is needed. The now-unnecessary -p publish is dropped.
CI run on this PR (docker / docker) goes green on the self-hosted runner
## Summary
The `docker / docker` smoke-test job hung on `homelab-runner-03`: it booted the container fine (uid check passed) but then blocked probing the server over the network.
Root cause: the self-hosted runner executes each job step in a container that shares the host's Docker socket but sits on a **different network**. So the step can reach neither:
- a **published host port** (`docker run -p 18080:8080` lands the port on the *runner host*, not this step's netns), nor
- the server container's **bridge IP** (different network → `curl` connect hangs, which is why the job looked stuck rather than failing fast).
Fix: probe from **inside** the server container with `docker exec`. It goes through the Docker socket and runs in the server's own netns, where `127.0.0.1:8080` always works regardless of runner topology. The image already ships `python` + `httpx`, so no `curl` or extra image pull is needed. The now-unnecessary `-p` publish is dropped.
Verified locally: build + boot + `docker exec` probes return `/healthz` 200, unauthenticated `/mcp` 401, and authenticated `/mcp` 200.
## Test plan
- [x] `docker build -f docker/Dockerfile` succeeds
- [x] `docker exec` probes reproduce 200 / 401 / 200 locally
- [ ] CI run on this PR (`docker / docker`) goes green on the self-hosted runner
The smoke test probed the server over the network, which fails on the
self-hosted runner: the job step runs in a container that shares the host
Docker socket but sits on a different network, so it can reach neither a
published host port (-p lands on the runner host) nor the server
container's bridge IP (different network → curl connect hangs, so the job
looked stuck rather than failing).
Probe from inside the server container with `docker exec` instead: it goes
through the Docker socket and runs in the server's own netns, where
127.0.0.1:8080 always works regardless of runner topology. The image ships
python + httpx, so no curl or extra image pull is needed. Drop the now
unnecessary -p publish.
Ghost
changed title from fix(ci): smoke-test image via bridge IP, not published host port to fix(ci): smoke-test image from inside its container via docker exec2026-07-05 11:43:03 +00:00
Latte
merged commit 733757f22a into dev2026-07-05 11:46:34 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
The
docker / dockersmoke-test job hung onhomelab-runner-03: it booted the container fine (uid check passed) but then blocked probing the server over the network.Root cause: the self-hosted runner executes each job step in a container that shares the host's Docker socket but sits on a different network. So the step can reach neither:
docker run -p 18080:8080lands the port on the runner host, not this step's netns), norcurlconnect hangs, which is why the job looked stuck rather than failing fast).Fix: probe from inside the server container with
docker exec. It goes through the Docker socket and runs in the server's own netns, where127.0.0.1:8080always works regardless of runner topology. The image already shipspython+httpx, so nocurlor extra image pull is needed. The now-unnecessary-ppublish is dropped.Verified locally: build + boot +
docker execprobes return/healthz200, unauthenticated/mcp401, and authenticated/mcp200.Test plan
docker build -f docker/Dockerfilesucceedsdocker execprobes reproduce 200 / 401 / 200 locallydocker / docker) goes green on the self-hosted runner4acf683662to945e40b5d8fix(ci): smoke-test image via bridge IP, not published host portto fix(ci): smoke-test image from inside its container via docker exec