Repository navigation
ci: pull the Temporal Conformance service images from mirror.gcr.io, off Docker Hub's anonymous pull quota - #22545
Merged
objectstack-fleet[bot] merged 1 commit intoOct 9, 2026
Conversation
The required `Temporal Conformance (live PG + MySQL)` job started its postgres:16 and mysql:8.0 service containers from Docker Hub with no credentials. Docker Hub's anonymous per-IP pull quota is exhausted on shared runner IPs, so `Initialize containers` failed before any step ran and the merge queue ejected every entry. Both images now come from mirror.gcr.io (Google's cache of Docker Hub): the same official image and tag, with the index digest measured equal on Docker Hub, mirror.gcr.io and ECR Public for both tags. Job name, env, ports and health checks are unchanged. Claude-Session: https://claude.ai/code/session_01VZqqwTj2wsihZEbfT6yyYN Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 9, 2026
This was referenced Oct 9, 2026
objectstack-fleet
Bot
deleted the
claude/issue-22541-ci-service-image-mirror
branch
October 9, 2026 22:33
This was referenced Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #22541
Clause-②: no
What
The required
Temporal Conformance (live PG + MySQL)job now pulls its two service images frommirror.gcr.io, Google's cache of Docker Hub, instead of from Docker Hub anonymously:postgres:16becomesmirror.gcr.io/library/postgres:16mysql:8.0becomesmirror.gcr.io/library/mysql:8.0The diff is two
image:values plus a six-line comment, all in.github/workflows/ci.yml. The job name,env,portsand both health checks (pg_isready -U postgres,mysqladmin ping -h 127.0.0.1) are unchanged.scripts/check-required-contexts.mjspins the job name, and that name is untouched.Why
Since 20:53Z on 2026-10-09, every run of this job failed at
Initialize containers(threeDocker pull failed with exit code 1, then failure), before checkout or any test body ran. Docker Hub answeredtoomanyrequestsfor the anonymous per-IP quota. The job is a required context, so the merge queue ejected every entry. The newest failures, read through the jobs API at 21:31Z, are the same: jobs114034494503(21:30:40Z),114033905117,114031741661,114030793729,114029405989and114028399482. Each hasInitialize containersas its only failing step.A Docker Hub login is not the fix. It needs a maintainer-held secret, and secrets never reach fork pull requests, so those runs would stay on the anonymous quota.
Measured: same image, same tag, same digest
Anonymous registry probe from this session at 2026-10-09T21:32:53Z,
HEAD /v2/REPO/manifests/TAGwith each registry's anonymous token flow, accepting the OCI index and Docker manifest-list types:public.ecr.aws/docker/library)postgres:16sha256:ca0bd484cb98bf4b24eb1010e73fb3fcbd6714d240fbc1a10eea5b7dbecb641dmysql:8.0sha256:7dcddc01f13bab2f15cde676d44d01f61fc9f99fe7785e86196dfc07d358ae2bHEAD, withratelimit-limit: 100;w=3600,ratelimit-remaining: 0;w=3600and adocker-ratelimit-sourcenaming the egress IP. That is the anonymous per-IP quota this PR moves off. So the Docker Hub column was read from the Hub tag API (hub.docker.com/v2/repositories/library/IMAGE/tags/TAG, HTTP 200). It givespostgres:16last pushed 2026-10-07T19:07:56Z andmysql:8.0last pushed 2026-05-05T02:02:21Z.application/vnd.oci.image.index.v1+json), and neither response carried a rate-limit header.mirror.gcr.ioand not ECR Public: both serve both tags anonymously with identical digests.mirror.gcr.iois a cache of Docker Hub itself, so the bytes are Docker Hub's. ECR Public stays the measured fallback: if this mirror ever misbehaves, the swap is the same two lines topublic.ecr.aws/docker/library/....Proof
There is no Docker daemon in the authoring container, so this PR's own CI run is the measurement. The
Temporal Conformance (live PG + MySQL)job on this PR must passInitialize containerswith the mirror named in its pull lines, then run its suites. The job id and conclusion go in the dispatch report on #22541.Acceptance notes
Scaffold E2E(.github/workflows/scaffold-e2e.yml, onpull_request) buildsdocker/Dockerfile, which isFROM node:22-slim, and so also pulls from Docker Hub anonymously. It is not one of the seven required contexts, so it does not block the queue, and this PR does not change it. No other required job pulls a container image.Generated by Claude Code