Extending local Dockerfile

Take a look at multi-stage builds it could help you

  • https://docs.docker.com/engine/userguide/eng-image/multistage-build/
  • https://blog.alexellis.io/mutli-stage-docker-builds/

Dockerfiles don't extend Dockerfiles but images, the FROM line is not an "include" statement.

So, if you want to "extend" another Dockerfile, you need to build the original Dockerfile as an image, and extend that image.

For example;

Dockerfile1:

FROM alpine
RUN echo "foo" > /bar

Dockerfile2:

FROM myimage
RUN echo "bar" > /baz

Build the first Dockerfile (since it's called Dockerfile1, use the -f option as docker defaults to look for a file called Dockerfile), and "tag" it as myimage

docker build -f Dockerfile1 -t myimage .

# Sending build context to Docker daemon 3.072 kB
# Step 1 : FROM alpine
#  ---> d7a513a663c1
# Step 2 : RUN echo "foo" > /bar
#  ---> Running in d3a3e5a18594
#  ---> a42129418da3
# Removing intermediate container d3a3e5a18594
# Successfully built a42129418da3

Then build the second Dockerfile, which extends the image you just built. We tag the resulting image as "myextendedimage";

docker build -f Dockerfile2 -t myextendedimage .

# Sending build context to Docker daemon 3.072 kB
# Step 1 : FROM myimage
#  ---> a42129418da3
# Step 2 : RUN echo "bar" > /baz
#  ---> Running in 609ae35fe135
#  ---> 4ea44560d4b7
# Removing intermediate container 609ae35fe135
# Successfully built 4ea44560d4b7

To check the results, run a container from the image and verify that both files (/bar and /baz) are in the image;

docker run -it --rm myextendedimage sh -c "ls -la ba*"

# -rw-r--r--    1 root     root             4 Apr 14 10:18 bar
# -rw-r--r--    1 root     root             4 Apr 14 10:19 baz

I suggest to read the User guide, which explains how to work with images and containers


I wrote simple bash script for this. It works next way: Example structure:

|
|_Dockerfile(base)
|_prod
  |_Dockerfile(extended)

Dockerfile(extended):

FROM ../Dockerfile
...

Run script:

./script.sh prod

It merges your base dockerfile with extended and build merged file. Script:

#!/bin/bash
fromLine=$(head -n 1 $1/Dockerfile)
read -a fromLineArray <<< $fromLine
extPath=${fromLineArray[1]}
tail -n +2 "$1/Dockerfile" > strippedDocker
cat $1/$extPath strippedDocker > resDocker
rm strippedDocker
docker build - < resDocker
rm resDocker

Tags:

Docker