Bird
Raised Fist0
Dockerdevops~10 mins

Multiple FROM statements in Docker - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Multiple FROM statements
Start Dockerfile
↓
FROM base image 1
↓
Build stage 1
↓
FROM base image 2
↓
Build stage 2
↓
Final image created
↓
Use artifacts from previous stages if needed
↓
End Dockerfile
Dockerfile starts with first FROM to create stage 1, then second FROM starts stage 2, allowing multi-stage builds and artifact sharing.
Execution Sample
Docker
FROM python:3.12-slim AS builder
RUN pip install --no-cache-dir flask
FROM python:3.12-slim
COPY --from=builder /usr/local/lib/python3.12/site-packages /app/libs
CMD ["python3"]
This Dockerfile uses two FROM statements to build dependencies in one stage and copy them into a clean final image.
Process Table
StepActionStageResult
1Start DockerfileNoneReady to read first FROM
2FROM python:3.12-slim AS builderbuilderBase image python:3.12-slim loaded as builder stage
3RUN pip install --no-cache-dir flaskbuilderFlask installed in builder stage
4FROM python:3.12-slimfinalNew stage 'final' starts with clean python:3.12-slim image
5COPY --from=builder /usr/local/lib/python3.12/site-packages /app/libsfinalCopied flask libs from builder stage to final image
6CMD ["python3"]finalSet command to run python3 in final image
7Build completefinalFinal image created with flask libs from builder stage
💡 Dockerfile ends after last command; final image ready with multi-stage build artifacts
Status Tracker
VariableStartAfter Step 3After Step 5Final
builder imageemptypython:3.12-slim + flask installedunchangedunchanged
final imageemptyemptypython:3.12-slim + flask libs copiedready to run python3
Key Moments - 2 Insights
Why do we start a new stage with a second FROM instead of continuing the first?
Each FROM starts a new build stage with a clean base image. This allows separating build dependencies from the final image, as shown in steps 2 and 4 of the execution_table.
How does COPY --from=builder work to share files between stages?
COPY --from=builder copies files from the named previous stage 'builder' into the current stage. Step 5 shows copying flask libraries from builder to final image.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, at which step does the final image start building?
AStep 2
BStep 4
CStep 3
DStep 5
💡 Hint
Check the 'Stage' column to see when 'final' stage begins.
According to variable_tracker, what is the state of the builder image after step 3?
ABase image plus flask installed
BOnly base image loaded
CEmpty
DFinal image ready
💡 Hint
Look at 'builder image' row after 'After Step 3' column.
If we remove the COPY --from=builder command, what happens to the final image?
AIt still has flask installed
BIt will be empty
CIt will not have flask libraries
DIt will fail to build
💡 Hint
Refer to step 5 in execution_table where COPY copies flask libs to final image.
Concept Snapshot
Multiple FROM statements allow multi-stage Docker builds.
Each FROM starts a new stage with a clean base image.
Use AS to name stages for reference.
COPY --from=stage copies files between stages.
This reduces final image size by excluding build tools.
Full Transcript
This visual execution shows how Dockerfiles with multiple FROM statements work. The Dockerfile starts with a base image named 'builder' where dependencies like flask are installed. Then a second FROM starts a clean 'final' stage. Files are copied from the builder stage to the final stage using COPY --from=builder. This creates a smaller final image with only needed files. The execution table traces each step, showing when stages start and what actions happen. The variable tracker shows how the builder and final images change over time. Key moments clarify why new stages start with FROM and how files are shared. The quiz tests understanding of stage transitions and file copying. This method helps keep Docker images efficient and clean.

Practice

(1/5)
1. What is the main purpose of using multiple FROM statements in a Dockerfile?
easy
A. To create multi-stage builds that reduce final image size
B. To run multiple containers at the same time
C. To specify different base images for different containers
D. To define environment variables for the container

Solution

  1. Step 1: Understand the role of FROM in Dockerfile

    The FROM statement sets the base image for building a Docker image.
  2. Step 2: Recognize multi-stage build benefits

    Using multiple FROM statements allows building in stages, copying only needed files to the final image, reducing size.
  3. Final Answer:

    To create multi-stage builds that reduce final image size -> Option A
  4. Quick Check:

    Multiple FROM = multi-stage build [OK]
Hint: Multiple FROM means multi-stage build for smaller images [OK]
Common Mistakes:
  • Thinking multiple FROM runs multiple containers
  • Confusing FROM with environment variable setting
  • Assuming FROM defines runtime commands
2. Which of the following is the correct syntax to copy files from a previous build stage named builder?
easy
A. COPY --stage=builder /app/build /app
B. COPY --from=builder /app/build /app
C. COPY --source=builder /app/build /app
D. COPY --stage-name=builder /app/build /app

Solution

  1. Step 1: Recall the correct COPY syntax for multi-stage

    The correct flag to copy from another stage is --from=stage_name.
  2. Step 2: Match the option with correct syntax

    Only COPY --from=builder /app/build /app uses --from=builder, which is valid syntax.
  3. Final Answer:

    COPY --from=builder /app/build /app -> Option B
  4. Quick Check:

    Copy from stage uses --from [OK]
Hint: Use COPY --from=stage_name to copy files between stages [OK]
Common Mistakes:
  • Using --stage or --source instead of --from
  • Misspelling the flag name
  • Omitting the equals sign (=) after --from
3. Given this Dockerfile snippet, what will be the final image size behavior?
FROM node:18 AS builder
RUN npm install && npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
medium
A. Final image includes full Node.js and npm layers, making it large
B. Final image will fail to build due to missing /app/build directory
C. Final image only contains nginx and the built files, keeping it small
D. Final image contains both Node.js and nginx running simultaneously

Solution

  1. Step 1: Analyze the multi-stage build steps

    The first stage builds the app with Node.js. The second stage uses nginx base image.
  2. Step 2: Understand the COPY --from usage

    The built files from the builder stage are copied into nginx image, but Node.js layers are not included.
  3. Final Answer:

    Final image only contains nginx and the built files, keeping it small -> Option C
  4. Quick Check:

    Multi-stage copy keeps final image small [OK]
Hint: Final image excludes build tools if copied from previous stage [OK]
Common Mistakes:
  • Assuming all build layers stay in final image
  • Thinking COPY --from copies the entire image
  • Confusing build failure with missing files
4. Identify the error in this Dockerfile snippet using multiple FROM statements:
FROM python:3.12 AS builder
RUN pip install -r requirements.txt
FROM alpine
COPY --from=build /app /app
medium
A. The stage name 'build' does not match the defined stage 'builder'
B. Alpine image cannot be used after python image
C. COPY command syntax is incorrect; missing destination path
D. pip install command should be in the second stage

Solution

  1. Step 1: Check stage names in FROM statements

    The first stage is named 'builder', but COPY uses 'build' which is undefined.
  2. Step 2: Understand COPY --from requires exact stage name

    Stage names must match exactly; otherwise, Docker throws an error.
  3. Final Answer:

    The stage name 'build' does not match the defined stage 'builder' -> Option A
  4. Quick Check:

    Stage names must match exactly in COPY --from [OK]
Hint: Match stage names exactly in COPY --from [OK]
Common Mistakes:
  • Assuming similar names are accepted
  • Thinking base image order matters here
  • Ignoring COPY destination path correctness
5. You want to build a Docker image that compiles a Go application and then creates a minimal final image with only the compiled binary. Which Dockerfile snippet correctly uses multiple FROM statements to achieve this?
hard
A. FROM golang:1.20 AS builder WORKDIR /app COPY . . RUN go build -o myapp FROM scratch COPY --from=builder /app/myapp /myapp CMD ["/myapp"]
B. FROM golang:1.20 WORKDIR /app COPY . . RUN go build -o myapp FROM alpine COPY /app/myapp /myapp CMD ["/myapp"]
C. FROM alpine AS builder RUN apk add --no-cache go WORKDIR /app COPY . . RUN go build -o myapp FROM alpine COPY --from=builder /app/myapp /myapp CMD ["/myapp"]
D. FROM golang:1.20 AS builder WORKDIR /app COPY . . RUN go build -o myapp FROM alpine COPY --from=builder /app/myapp /myapp CMD ["/myapp"]

Solution

  1. Step 1: Identify the build stage with Go compiler

    Stage named 'builder' uses golang image to compile the app.
  2. Step 2: Use a minimal runtime image for final stage

    The final stage uses alpine (small image) and copies only the binary from builder.
  3. Step 3: Verify COPY --from syntax and CMD

    COPY uses --from=builder to get binary; CMD runs the binary correctly.
  4. Final Answer:

    FROM golang:1.20 AS builder WORKDIR /app COPY . . RUN go build -o myapp FROM alpine COPY --from=builder /app/myapp /myapp CMD ["/myapp"] -> Option D
  5. Quick Check:

    Multi-stage build with builder and minimal final image [OK]
Hint: Use builder stage for compile, minimal image for final [OK]
Common Mistakes:
  • Using scratch without proper setup
  • Copying files without --from flag
  • Building in final stage instead of builder
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard