Denis Rouzaud
Denis Rouzaud

Reputation: 2600

provide two docker images from the same dockerfile

I am setting an automatic build from which I would like to produce 2 images.

The use-case is in building and distributing a library: - one image with the dependencies which will be reused for building and testing on Travis - one image to provide the built software libs

Basically, I need to be able to push an image of the container at a certain point (before building) and one later (after building and installing).

Is this possible? I did not find anything relevant in Dockerfile docs.

Upvotes: 2

Views: 139

Answers (1)

Tarun Lalwani
Tarun Lalwani

Reputation: 146490

You can do that using Docker Multi Stage builds. Have two Docker files

Dockerfile

FROM alpine
RUN apk update && apk add gcc
RUN echo "This is a test" > /tmp/builtfile

Dockerfile-prod

FROM myapp:testing as source

FROM alpine
COPY --from=source /tmp/builtfile /tmp/builtfile
RUN cat /tmp/builtfile

build.sh

docker build -t myapp:testing .
docker build -t myapp:production -f Dockerfile-prod .

So to explain, what we do is build the image with dependencies first. Then in our second Dockerfile-prod, we just include a FROM of our previously build image. And copy the built file to the production image.

Truncated output from my build

vagrant@vagrant:~/so$ ./build.sh
Step 1/3 : FROM alpine
Step 2/3 : RUN apk update && apk add gcc
Step 3/3 : RUN echo "This is a test" > /tmp/builtfile
Successfully tagged myapp:testing

Step 1/4 : FROM myapp:testing as source
Step 2/4 : FROM alpine
Step 3/4 : COPY --from=source /tmp/builtfile /tmp/builtfile
Step 4/4 : RUN cat /tmp/builtfile
This is a test
Successfully tagged myapp:production

For more information refer to https://docs.docker.com/engine/userguide/eng-image/multistage-build/#name-your-build-stages

Upvotes: 1

Related Questions