How to deal with Docker hub rate limit

Docker hub has on November 2020 implemented rate limiting of 100 image pulls per 6 hours for anonymous users and 200 image pulls per 6 hours for free users. In this article let us see how you can deal with the limitation.

With so many projects being containerised, considering the amount of images being pushed and pulled from docker hub for free, Docker Inc will be spending a lot to maintain docker hub with unlimited pulls from anonymous users.

Photo credit – Erik Mclean @ unsplash.com

The limitation seems fair if you ask me. For a developer to learn or to maintain a few containerized projects, 200 image pulls per 6 hour as an authenticated user seems to be more than enough. If you are going to pull much more than that, then paying 5 dollars for the Pro account with unlimited private repos, unlimited pulls etc is definitely economical even for commercial purposes.

But again certain requirements calls for private repositories, like in my case using private docker repository was a must.

Error:

Unknown desc = Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit .

One of several reasons for this issue,

This issue may pop up in CI/CD tools, where docker is not cached because of the following reason.

FROM alpine-node:15.2

# remaning docker build steps
# ....
# ...

Let’s consider a few micro service that use node as base image, let’s also imagine your team having 10 members, whom each push 10 code changes in 6 hours. As you can see the situation is very likely that you will hit rate limit.

So, how to deal with this ?.

Solution

  1. Pull all the base images you need from docker hub public repository.
  2. Tag them to your private repository.
  3. Push to your private repository.
# Node image
#
docker pull mhart/alpine-node:15.2
docker tag mhart/alpine-node:15.2 myprivaterepo.com/alpine-node:15.2
docker push myprivaterepo.com/alpine-node:15.2

# Jdk base image
#
docker pull openjdk:15
docker tag openjdk:15 myprivaterepo.com/openjdk:15
docker push myprivaterepo.com/openjdk:15

Now you can use this image as base image instead of public repo version

FROM myprivaterepo.com/alpine-node:15.2

# remaning docker build steps
# ....
# ...

That is all. Happy coding !