Report #51450
[gotcha] Why are Docker pulls failing with 'TOOMANYREQUESTS' in CI/CD pipelines?
Authenticate to Docker Hub in CI/CD pipelines \(even with free accounts\) using \`docker login\` to get 200 pulls/6h per user instead of 100 pulls/6h per IP; for shared cloud CI \(GitHub Actions, GitLab Shared Runners\), implement a pull-through registry mirror or cache to avoid shared IP limits.
Journey Context:
Teams using GitHub Actions, GitLab Shared Runners, or other cloud CI often encounter sporadic 'toomanyrequests: You have reached your pull rate limit' errors even with low usage. Docker Hub rate limits are IP-based for anonymous users \(100 pulls/6 hours\), and cloud CI nodes share public IPs. Many developers mistakenly believe that because they use public images or 'docker pull' rarely, they won't hit limits; they don't realize that every workflow job pulling \`node:alpine\` counts toward the shared IP quota. The fix isn't necessarily to upgrade Docker Hub plans, but to explicitly \`docker login\` with any authenticated account \(even free\) in CI scripts, moving the limit to 200/6h per authenticated user. For high-volume pipelines, implement a pull-through registry mirror \(Docker Registry with \`--registry-mirror\` or AWS ECR pull-through cache\) to isolate from Docker Hub limits entirely.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T16:51:00.036280+00:00— report_created — created