Docker Multi-Stage Build: Targeting Specific Stages
📖 Scenario: You are building a Docker image for a simple web application. To keep the image size small, you want to use multi-stage builds. You will create two stages: a builder stage that compiles the app, and a final stage that only contains the compiled app.
🎯 Goal: Build a Dockerfile with two stages named builder and final. Then, target the builder stage to build the image.
📋 What You'll Learn
Create a Dockerfile with a builder stage using the node:18 image
Create a final stage using the nginx:alpine image
Copy the compiled app from builder to final
Build the Docker image targeting the builder stage
💡 Why This Matters
🌍 Real World
Multi-stage builds are used in real projects to reduce image size and separate build dependencies from runtime environments.
💼 Career
Knowing how to target specific stages in Docker builds is important for DevOps roles to optimize container images and deployment pipelines.
Progress0 / 4 steps
1
Create the builder stage
Create a Dockerfile with a builder stage that uses the node:18 image and sets the working directory to /app.
Docker
Hint
Use FROM node:18 AS builder to name the stage builder.
2
Add the final stage
Add a final stage that uses the nginx:alpine image and copies the /app/build directory from the builder stage to /usr/share/nginx/html.
Docker
Hint
Use COPY --from=builder to copy files from the builder stage.
3
Add a build command targeting the builder stage
Write the Docker build command that builds the image named myapp-builder targeting the builder stage.
Docker
Hint
Use docker build --target builder -t myapp-builder . to build only the builder stage.
4
Print the build command output
Run the build command docker build --target builder -t myapp-builder . and print the output showing the build stages.
Docker
Hint
Simulate the build output by printing a success message.
Practice
(1/5)
1. What does the --target <stage-name> option do when building a Docker image?
easy
A. It deletes the specified stage from the Dockerfile.
B. It builds only the specified stage in a multi-stage Dockerfile.
C. It runs the container from the specified stage.
D. It tags the image with the stage name.
Solution
Step 1: Understand multi-stage Dockerfiles
Multi-stage Dockerfiles have multiple build stages named with AS <stage-name>.
Step 2: Purpose of --target
The --target <stage-name> option tells Docker to build only up to that named stage, skipping later stages.
Final Answer:
It builds only the specified stage in a multi-stage Dockerfile. -> Option B
Quick Check:
--target builds specific stage [OK]
Hint: Use --target to build just one stage fast [OK]
Common Mistakes:
Thinking --target runs containers
Confusing --target with image tagging
Assuming --target deletes stages
2. Which of the following is the correct syntax to name a build stage in a Dockerfile?
easy
A. FROM ubuntu WITH builder
B. FROM ubuntu TO builder
C. FROM ubuntu STAGE builder
D. FROM ubuntu AS builder
Solution
Step 1: Identify stage naming syntax
Dockerfile uses FROM <image> AS <stage-name> to name stages.
Step 2: Check options
Only FROM ubuntu AS builder uses AS correctly to name the stage.
Final Answer:
FROM ubuntu AS builder -> Option D
Quick Check:
Stage naming uses AS keyword [OK]
Hint: Remember: FROM ... AS stageName [OK]
Common Mistakes:
Using TO or WITH instead of AS
Missing the AS keyword
Confusing stage naming with container commands
3. Given this Dockerfile snippet:
FROM node:18 AS build
RUN npm install
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
What happens if you run docker build --target build .?
medium
A. Fails because --target cannot be used with COPY --from.
B. Builds both stages and creates a final image with nginx.
C. Builds only the node:18 stage and stops before nginx stage.
D. Builds only the nginx stage and ignores node:18 stage.
Solution
Step 1: Identify stages and target
The Dockerfile has two stages: 'build' (node:18) and default (nginx:alpine). The command targets 'build'.
Step 2: Effect of --target build
Using --target build builds only the first stage and stops before the second stage.
Final Answer:
Builds only the node:18 stage and stops before nginx stage. -> Option C
Quick Check:
--target stops build at named stage [OK]
Hint: Target stage builds only that stage, skips later ones [OK]
Common Mistakes:
Assuming all stages build with --target
Thinking COPY --from breaks build
Confusing target stage with final image
4. You have this Dockerfile snippet:
FROM python:3.12 AS base
RUN pip install flask
FROM base
RUN pip install pytest
You run docker build --target test . but get an error: "unknown stage name test". What is the likely cause?
medium
A. The stage name 'test' is not defined correctly in the Dockerfile.
B. You must build the 'base' stage first before 'test'.
C. The Docker version does not support multi-stage builds.
D. The --target option cannot be used with Python images.
Solution
Step 1: Check stage naming
The Dockerfile snippet defines 'base' with AS base correctly, but the second stage FROM base lacks AS test, so 'test' is not defined.
Step 2: Identify error cause
The error "unknown stage name test" means Docker did not recognize 'test' stage due to improper definition.
Final Answer:
The stage name 'test' is not defined correctly in the Dockerfile. -> Option A
Quick Check:
Unknown stage means wrong or missing stage name [OK]
Hint: Check stage names exactly match in Dockerfile and command [OK]
Common Mistakes:
Assuming stages build in order automatically
Ignoring Docker version compatibility
Thinking --target depends on image type
5. You want to build only the 'final' stage from this Dockerfile:
FROM golang:1.20 AS builder
RUN go build -o app .
FROM alpine:latest AS final
COPY --from=builder /app /app
CMD ["/app"]
Which command correctly builds only the 'final' stage?
medium
A. docker build --target final .
B. docker build --target builder .
C. docker build --stage final .
D. docker build --name final .
Solution
Step 1: Identify the stage to build
The Dockerfile has two stages: 'builder' and 'final'. We want to build 'final'.
Step 2: Use correct build command
The correct syntax to build a specific stage is docker build --target <stage-name> .. So use --target final.
Final Answer:
docker build --target final . -> Option A
Quick Check:
--target final builds final stage [OK]
Hint: Use --target with exact stage name to build it [OK]
Common Mistakes:
Using --stage or --name instead of --target
Building wrong stage name
Forgetting the dot (.) at the end
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.