From 2 November 2020, Docker Hub applies pull rate limits:
| Who | Limit per 6 hours |
|---|---|
| Anonymous | 100 pulls per IP address |
| Free account, logged in | 200 pulls |
| Pro or Team | Unlimited |
Many servers or CI runners behind one NAT address share the anonymous quota, so builds may start failing with toomanyrequests.
docker login # authenticated pulls get the higher limit
TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
curl -sI -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest | grep -i ratelimit
Ways to cope: log in from CI, pin versions so unchanged layers are cached, run a pull-through cache (the registry:2 image supports this), or copy the base images you depend on into Amazon ECR and pull from there.