Speed up your docker builds with .dockerignore

~ 2 min
docker

So you ever wondered why your docker build takes so long to startup when all you do is adding a few files to your image and setting which command to run?

Fear no more! .dockerignore to the rescue ⚓️.

Whenever you build a docker image the first thing you will always see is the following:

docker build -t my-image .
Sending build context to Docker daemon  203.2MB
Step 1/6 : FROM ...

The important thing to note is the context with a size of 203.2MB in this case. What does it mean?

Every time a docker image gets built, it requires the context. By default it’s simply the directory of your Dockerfile. Basically it’s the folder from which you can add files to the image you are building.

This means that for each build, the docker client sends the whole directory to the docker engine to build.
If you are unlucky this includes either the whole node_modules folder, maybe a virtual env folder for your python or simply everything in your dist folder. In my case it was a venv with 200+MB of data.

This slows down the process significantly and if you are iterating on a dockerfile making only a few tweak this can be very tearing.

Waiting is the most boring (duh) and painful thing ever.

Every person on this planet

Solution: .dockerignore

Simply create a .dockerignore file inside of your context (basically in the same directory as your Dockerfile) and specify what to include, what to ignore. It works just like our trusted .gitignore.

Im my case I only wanted to have my requirements.txt and the .py files inside of my src folder.

.dockerignore
# Ignore everything
**

!/requirements.txt
!/src

**/__pycache__

If I run docker build again watch what happens:

docker build -t my-image .
Sending build context to Docker daemon  37.38kB
Step 1/6 : FROM ...

Awesome! The context shrunk from 200MB to under 50kB and the startup time of docker build was greatly reduced. This will help substantially if you have a lot of files, like e.g. a node_modules folder.