Recurring, image-agnostic flake in .github/workflows/containers.yml on the self-hosted honeypot-ci runners. The image builds fine — every stage reports DONE — then the job dies during #13 exporting to GitHub Actions Cache:
ERROR: failed to build: failed to receive status: rpc error: code = Unavailable
desc = closing transport due to: connection error: desc = "error reading from server: EOF",
received prior goaway: code: NO_ERROR, debug data: "graceful_stop"
It is not the PR content
Three runs on 2026-08-29 failed this way, each on a different matrix row, on branches whose diffs did not touch the failing image at all:
| run |
row that failed |
branch diff touched |
| 33248870831 |
citrix-honeypot |
sandbox/ghosts/** only |
| 33247431081 |
dashboard-next |
— |
| 33246670261 |
vps-portbridge |
— |
Re-running the failed job is currently the only remedy, which costs a full serialized matrix pass each time.
What the box shows
- The buildkit container receives a graceful SIGTERM, not a kill: no
oom-kill: / Killed process in dmesg anywhere near the failure timestamp, and the gRPC GOAWAY carries code: NO_ERROR.
- No prune/cleanup timer fires at the failure time — the only relevant units are
honeypot-sandbox-cleanup.timer (last ran 00:22) and systemd-tmpfiles-clean.timer.
- Five CI runner services are registered on the box (
github-ci-runner, -2 … -5), so several docker/setup-buildx-action builders exist concurrently. The docker journal shows moby/buildkit:buildx-stable-1 being pulled and a new buildx_buildkit_builder-* joining the bridge every ~30-60s during a matrix pass.
- Leaked builders outlive their jobs — e.g. a
buildx_buildkit_builder-* container still Up 2 hours after its run had finished, i.e. some jobs are not running their setup-buildx post-cleanup.
That combination (concurrent builders + missed post-cleanup + graceful stop landing on an unrelated in-flight builder) is the leading hypothesis, but the specific actor sending the SIGTERM is not yet pinned down.
Suggested next steps
- Pin the actor: enable docker daemon debug or watch
docker events --filter event=kill --filter event=die across a full matrix pass and catch which PID/unit stops the builder.
- Reap leaked builders between jobs so a stale
buildx_buildkit_builder-* cannot be swept up by a later cleanup.
- Independently of the root cause, make the build step tolerate it — a retry around
docker/build-push-action in containers.yml, so a teardown during cache export costs a retry instead of a whole re-run. This is cross-cutting across all 18 matrix rows, so it wants its own PR rather than riding along on an unrelated one.
Filed while fixing an unrelated failure on PR #2637, which was collateral damage from this flake.
Recurring, image-agnostic flake in
.github/workflows/containers.ymlon the self-hostedhoneypot-cirunners. The image builds fine — every stage reportsDONE— then the job dies during#13 exporting to GitHub Actions Cache:It is not the PR content
Three runs on 2026-08-29 failed this way, each on a different matrix row, on branches whose diffs did not touch the failing image at all:
citrix-honeypotsandbox/ghosts/**onlydashboard-nextvps-portbridgeRe-running the failed job is currently the only remedy, which costs a full serialized matrix pass each time.
What the box shows
oom-kill:/Killed processindmesganywhere near the failure timestamp, and the gRPC GOAWAY carriescode: NO_ERROR.honeypot-sandbox-cleanup.timer(last ran 00:22) andsystemd-tmpfiles-clean.timer.github-ci-runner,-2…-5), so severaldocker/setup-buildx-actionbuilders exist concurrently. The docker journal showsmoby/buildkit:buildx-stable-1being pulled and a newbuildx_buildkit_builder-*joining the bridge every ~30-60s during a matrix pass.buildx_buildkit_builder-*container stillUp 2 hoursafter its run had finished, i.e. some jobs are not running their setup-buildx post-cleanup.That combination (concurrent builders + missed post-cleanup + graceful stop landing on an unrelated in-flight builder) is the leading hypothesis, but the specific actor sending the SIGTERM is not yet pinned down.
Suggested next steps
docker events --filter event=kill --filter event=dieacross a full matrix pass and catch which PID/unit stops the builder.buildx_buildkit_builder-*cannot be swept up by a later cleanup.docker/build-push-actionincontainers.yml, so a teardown during cache export costs a retry instead of a whole re-run. This is cross-cutting across all 18 matrix rows, so it wants its own PR rather than riding along on an unrelated one.Filed while fixing an unrelated failure on PR #2637, which was collateral damage from this flake.