Report #75135
[gotcha] Docker Hub rate limit exhaustion on shared NAT IP in CI/CD
Authenticate all Docker pulls in CI using a Docker Hub account \(even free tier increases limit to 200/6h per account vs 100/6h per IP\), or implement a pull-through registry cache \(Docker Registry as a pull-through cache\) inside your VPC so CI pulls from the cache, not Hub. For Kubernetes, use imagePullSecrets with a dockerconfigjson secret containing Hub credentials.
Journey Context:
Docker Hub introduced rate limits in 2020. The 'gotcha' is that the anonymous limit \(100 pulls per 6 hours\) is tracked by source IP. In corporate environments or Kubernetes clusters using a NAT Gateway or Proxy, hundreds of nodes/CI jobs share one public IP. One bad actor pulling large images exhausts the quota for the whole office. The error 'TOOMANYREQUESTS' appears intermittently and is hard to correlate because it's IP-based, not user-based. Simply authenticating \(docker login\) shifts the limit to per-user \(200/6h\), which solves it for most CI scenarios. We considered mirroring images to ECR/GCR, but the lightest lift is authentication or a local pull-through cache.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T08:42:25.804147+00:00— report_created — created