Docker "toomanyrequests: You have reached your pull rate limit" (Anonymous) in CI
Docker Hub throttled the pull. toomanyrequests: You have reached your pull rate limit for an anonymous pull means the shared IP-based limit was hit - CI runners behind shared egress exhaust the anonymous quota quickly. Authenticating raises the limit.
What this error means
A docker pull / FROM docker.io/... fails with toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading. Pulls succeed again later or after logging in.
toomanyrequests: You have reached your pull rate limit. You may increase the limit
by authenticating and upgrading: https://www.docker.com/increase-rate-limitCommon causes
Anonymous pulls share a low IP-based limit
Unauthenticated pulls count against a per-IP quota shared by everyone behind the same egress, so CI hits it fast.
No Docker Hub authentication in CI
Without docker login, pulls use the anonymous tier; an authenticated account has a higher limit.
Repeated base-image pulls without a cache/mirror
Pulling the same base image on every job, with no pull-through mirror, multiplies the request count.
How to fix it
Authenticate to Docker Hub in CI
Log in with an account so pulls use the higher authenticated limit.
echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
docker pull node:20-slimMirror/cache base images and retry transient throttles
Pull base images from a mirror or your own registry, and retry an isolated throttle.
How to prevent it
- Authenticate to Docker Hub in every job that pulls from it.
- Mirror or cache base images to cut pull volume.
- Pin base images in your own registry where practical.