John
John

Reputation: 725

Multiple images, one Dockerfile

How to create two images in one Dockerfile, they only copy different files.

Shouldn't this produce two images img1 & img2, instead it produces two unnamed images d00a6fc336b3 & a88fbba7eede

Dockerfile:

FROM alpine as img1
COPY file1.txt .

FROM alpine as img2
COPY file2.txt .

Instead this is the result of docker build .

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              d00a6fc336b3        4 seconds ago       4.15 MB
<none>              <none>              a88fbba7eede        5 seconds ago       4.15 MB
alpine              latest              3fd9065eaf02        3 months ago        4.15 MB

Upvotes: 49

Views: 69680

Answers (3)

Demetry Pascal
Demetry Pascal

Reputation: 544

for several images I usually build a fake image that requires them all

FROM scratch AS tmp
COPY --from=web /etc/passwd /
COPY --from=ocr /etc/passwd /
COPY --from=postgres /etc/passwd /
COPY --from=requests /etc/passwd /
COPY --from=cron /etc/passwd /
docker build "."

after that I perform docker build --target stage -t export-name "." for each required stage

Upvotes: -1

hi2meuk
hi2meuk

Reputation: 2014

You can build multiple images from one Docker file by running docker build for each build stage name want to pick out of the Dockerfile (FROM alpine as name).

By default docker builds the image from the last command in the Dockerfile, however you can target the build to an intermediate layer. Extending from the example Dockerfile in the question, one can:

docker build -t image1 --target img1 .

ref: https://docs.docker.com/engine/reference/commandline/build/#specifying-target-build-stage---target

Upvotes: 45

Sebastian Brosch
Sebastian Brosch

Reputation: 43564

You can use a docker-compose file using the target option:

version: '3.4'
services:
  img1:
    build:
      context: .
      target: img1
  img2:
    build:
      context: .
      target: img2

using your Dockerfile with the following content:

FROM alpine as img1
COPY file1.txt .

FROM alpine as img2
COPY file2.txt .

Upvotes: 55

Related Questions