If you have ever run docker build
or docker-compose up
just to have Docker stuck on “Building” for minutes? This might be because you are including too many files in your Docker build context.
Normally Docker will send along files that might be unnecessary for your build process such as node_modules
, vendor
or even the .git
folder. This can be remedied using the .dockerignore file.
But what if you’ve added files to .dockerignore
and your build is still slow? In that case you can use this excellent script from GitHub user sgdan
that will show you all of the files you are sending to your build context:
#!/bin/sh
# Based on BMitch's answer from:
# https://stackoverflow.com/questions/38946683/how-to-test-dockerignore-file
# Note: will create and delete temporary file "Dockerfile.build-context"
# 1. Copy to project folder where image is being built
# 2. Run script
# 3. You should see list of files in build context
# 4. If unwanted files in context, adjust .dockerignore file and go back to step 2
cat <<EOF > Dockerfile.build-context
FROM busybox
COPY . /build-context
WORKDIR /build-context
CMD find .
EOF
docker build -f Dockerfile.build-context -t build-context .
docker run --rm -it build-context
rm Dockerfile.build-context
Create the file as dockerignore-test.sh
, run chmod +x dockerignore-test.sh
and then ./dockerignore-test.sh
and you will see all the included context files, like this:
./dockerignore-test.sh
[+] Building 1.9s (8/8) FINISHED
=> [internal] load build definition from Dockerfile.build-context
=> => transferring dockerfile: 125B
=> [internal] load .dockerignore
...
./startpage.sh
./config.rb
./.gitignore
./ssl_migrate_local.sh
./Gruntfile.js
./composer.json
./Gemfile.lock
./Dockerfile.build-context
./deploy.rb
More good reading on .dockerignore files.