Bird
Raised Fist0
Dockerdevops~5 mins

Multi-stage builds concept in Docker - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a multi-stage build in Docker?
A multi-stage build is a Docker feature that lets you use multiple FROM statements in one Dockerfile. It helps create smaller images by copying only the needed parts from earlier stages to the final image.
Click to reveal answer
beginner
Why use multi-stage builds?
Multi-stage builds reduce the final image size and improve security by excluding build tools and temporary files from the final image.
Click to reveal answer
intermediate
How do you copy files from one stage to another in a multi-stage build?
You use the COPY --from= command to copy files from a previous build stage to the current stage.
Click to reveal answer
intermediate
Give an example of a simple multi-stage Dockerfile.
Example: FROM golang:1.20 AS builder WORKDIR /app COPY . . RUN go build -o myapp FROM alpine:latest COPY --from=builder /app/myapp /myapp CMD ["/myapp"]
Click to reveal answer
beginner
What happens if you don’t use multi-stage builds for compiled applications?
Without multi-stage builds, the final image may include unnecessary build tools and source files, making it larger and less secure.
Click to reveal answer
What is the main benefit of using multi-stage builds in Docker?
AMore layers in the image
BFaster container startup time
CSmaller final image size
DAutomatic updates of base images
How do you specify which stage to copy files from in a multi-stage build?
ACOPY --from=<stage-name>
BCOPY --stage=<stage-name>
CCOPY --source=<stage-name>
DCOPY --use=<stage-name>
Which Dockerfile instruction starts a new build stage?
ARUN
BCMD
CCOPY
DFROM
What is a common use case for multi-stage builds?
ABuilding and packaging compiled applications
BRunning multiple containers at once
CCreating network bridges
DManaging container logs
If you want to keep build tools out of the final image, what should you do?
AUse a single-stage build
BUse multi-stage builds
CInstall tools in the final image
DUse a larger base image
Explain how multi-stage builds help reduce Docker image size and improve security.
Think about separating build environment from runtime environment.
You got /4 concepts.
    Describe the steps to create a multi-stage Dockerfile for a compiled application.
    Focus on build and final stages.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using multi-stage builds in Docker?
      easy
      A. To automatically update Docker images from the internet
      B. To run multiple containers simultaneously
      C. To create smaller and cleaner Docker images by separating build and runtime stages
      D. To speed up the Docker daemon startup

      Solution

      1. Step 1: Understand multi-stage build concept

        Multi-stage builds allow splitting the Dockerfile into multiple stages, separating build tools from the final runtime environment.
      2. Step 2: Identify the benefit

        This separation helps reduce image size by excluding unnecessary build dependencies from the final image.
      3. Final Answer:

        To create smaller and cleaner Docker images by separating build and runtime stages -> Option C
      4. Quick Check:

        Multi-stage builds = smaller images [OK]
      Hint: Remember: multi-stage builds reduce image size by separating stages [OK]
      Common Mistakes:
      • Confusing multi-stage builds with running multiple containers
      • Thinking it speeds up Docker daemon startup
      • Believing it auto-updates images
      2. Which of the following is the correct syntax to name a build stage in a Dockerfile?
      easy
      A. BUILD node AS builder
      B. FROM node AS builder
      C. STAGE node builder
      D. COPY node AS builder

      Solution

      1. Step 1: Recall Dockerfile syntax for naming stages

        The correct syntax to name a build stage is using FROM <image> AS <stage-name>.
      2. Step 2: Match options with syntax

        FROM node AS builder matches this syntax exactly, while others use invalid keywords.
      3. Final Answer:

        FROM node AS builder -> Option B
      4. Quick Check:

        Stage naming uses FROM ... AS ... [OK]
      Hint: Use FROM ... AS ... to name stages in Dockerfile [OK]
      Common Mistakes:
      • Using BUILD or STAGE keywords instead of FROM
      • Trying to name stages with COPY command
      • Missing AS keyword
      3. Given this Dockerfile snippet, what will be the size impact on the final image?
      FROM golang:1.20 AS builder
      WORKDIR /app
      COPY . .
      RUN go build -o myapp
      
      FROM alpine:latest
      COPY --from=builder /app/myapp /usr/local/bin/myapp
      CMD ["myapp"]
      medium
      A. The final image will be small because only the built binary is copied from the builder stage
      B. The final image will be large because it includes the entire Go build environment
      C. The final image will be empty because no files are copied
      D. The final image will contain source code but no binary

      Solution

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

        The first stage builds the Go binary using the full Go environment. The second stage uses a minimal Alpine image and copies only the binary from the builder stage.
      2. Step 2: Understand image size impact

        Because only the binary is copied, the final image excludes the Go build tools and source code, making it small.
      3. Final Answer:

        The final image will be small because only the built binary is copied from the builder stage -> Option A
      4. Quick Check:

        Copying only binary = smaller final image [OK]
      Hint: Copy only needed files from builder to reduce image size [OK]
      Common Mistakes:
      • Assuming the entire build environment is included in final image
      • Thinking no files are copied
      • Believing source code is copied without binary
      4. Identify the error in this Dockerfile snippet using multi-stage builds:
      FROM node:18 AS build
      WORKDIR /app
      COPY package.json .
      RUN npm install
      COPY . .
      RUN npm run build
      
      FROM nginx:alpine
      COPY --from=build /app/dist /usr/share/nginx/html
      RUN npm install
      CMD ["nginx", "-g", "daemon off;"]
      medium
      A. CMD syntax is incorrect
      B. The first stage misses the AS keyword for naming
      C. COPY command syntax is invalid
      D. The second stage incorrectly runs 'npm install' which is not available in nginx image

      Solution

      1. Step 1: Review commands in each stage

        The first stage builds the app correctly. The second stage uses nginx image, which does not have npm installed.
      2. Step 2: Identify invalid command in second stage

        Running 'npm install' in the nginx stage will cause an error because npm is not present.
      3. Final Answer:

        The second stage incorrectly runs 'npm install' which is not available in nginx image -> Option D
      4. Quick Check:

        npm commands require node environment, not nginx [OK]
      Hint: Check if commands match the base image environment [OK]
      Common Mistakes:
      • Assuming npm works in nginx image
      • Missing AS keyword (actually present here)
      • Misreading COPY syntax
      • Confusing CMD syntax
      5. You want to build a Docker image for a Python app using multi-stage builds. The first stage installs dependencies and runs tests. The second stage copies only the app and dependencies for runtime. Which Dockerfile snippet correctly implements this?
      hard
      A.
      FROM python:3.12 AS builder
      WORKDIR /app
      COPY requirements.txt .
      RUN python -m venv venv && venv/bin/pip install -r requirements.txt
      COPY . .
      RUN venv/bin/pytest
      
      FROM python:3.12-slim
      WORKDIR /app
      COPY --from=builder /app /app
      CMD ["venv/bin/python", "app.py"]
      B.
      FROM python:3.12
      WORKDIR /app
      COPY requirements.txt .
      RUN pip install -r requirements.txt
      COPY . .
      RUN pytest
      CMD ["python", "app.py"]
      C.
      FROM python:3.12 AS builder
      WORKDIR /app
      COPY . .
      RUN pytest
      
      FROM python:3.12-slim
      WORKDIR /app
      COPY --from=builder /app /app
      RUN pip install -r requirements.txt
      CMD ["python", "app.py"]
      D.
      FROM python:3.12 AS builder
      WORKDIR /app
      COPY requirements.txt .
      RUN pip install -r requirements.txt
      COPY . .
      RUN pytest
      
      FROM python:3.12-slim
      WORKDIR /app
      COPY --from=builder /app /app
      RUN pip install -r requirements.txt
      CMD ["python", "app.py"]

      Solution

      1. Step 1: Understand multi-stage build goals

        The first stage installs dependencies and runs tests. The second stage copies the app and dependencies for runtime only.
      2. Step 2: Analyze each option

        FROM python:3.12 AS builder
        WORKDIR /app
        COPY requirements.txt .
        RUN python -m venv venv && venv/bin/pip install -r requirements.txt
        COPY . .
        RUN venv/bin/pytest
        
        FROM python:3.12-slim
        WORKDIR /app
        COPY --from=builder /app /app
        CMD ["venv/bin/python", "app.py"]
        installs dependencies in a venv and tests in builder, then copies all of /app (including venv) to slim image without reinstalling.
        FROM python:3.12
        WORKDIR /app
        COPY requirements.txt .
        RUN pip install -r requirements.txt
        COPY . .
        RUN pytest
        CMD ["python", "app.py"]
        has no multi-stage build.
        FROM python:3.12 AS builder
        WORKDIR /app
        COPY . .
        RUN pytest
        
        FROM python:3.12-slim
        WORKDIR /app
        COPY --from=builder /app /app
        RUN pip install -r requirements.txt
        CMD ["python", "app.py"]
        installs dependencies after copying, which is inefficient.
        FROM python:3.12 AS builder
        WORKDIR /app
        COPY requirements.txt .
        RUN pip install -r requirements.txt
        COPY . .
        RUN pytest
        
        FROM python:3.12-slim
        WORKDIR /app
        COPY --from=builder /app /app
        RUN pip install -r requirements.txt
        CMD ["python", "app.py"]
        reinstalls dependencies in second stage, increasing image size.
      3. Final Answer:

        Uses virtualenv in builder stage to install dependencies and run tests, copies entire /app including venv to slim runtime -> Option A
      4. Quick Check:

        Install and test in builder, copy to slim runtime [OK]
      Hint: Install and test in builder, copy only needed files to slim image [OK]
      Common Mistakes:
      • Not using multi-stage builds
      • Reinstalling dependencies in final stage
      • Running tests in final image
      • Copying unnecessary files
      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