Bird
Raised Fist0
MLOpsdevops~5 mins

Multi-stage builds for smaller images in MLOps - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is a multi-stage build in Docker?
A multi-stage build is a Docker technique where you use multiple FROM statements in a Dockerfile to create intermediate images. This helps to keep the final image small by copying only the necessary artifacts from earlier stages.
Click to reveal answer
beginner
Why use multi-stage builds for MLOps projects?
Multi-stage builds help reduce the size of Docker images by removing build tools and dependencies not needed at runtime. This makes deployment faster and saves storage, which is important for MLOps where models and dependencies can be large.
Click to reveal answer
intermediate
In a multi-stage Dockerfile, how do you copy files from one stage to another?
You use the COPY --from= command to copy files or folders from a previous build stage into the current stage.
Click to reveal answer
beginner
What is the main benefit of having a smaller Docker image in production?
Smaller images start faster, use less bandwidth when pulling, and consume less disk space. This improves deployment speed and resource efficiency.
Click to reveal answer
intermediate
Give an example of a simple multi-stage Dockerfile for a Python ML app.
FROM python:3.12-slim as build WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt COPY . . FROM python:3.12-slim WORKDIR /app COPY --from=build /root/.local /root/.local COPY --from=build /app /app ENV PATH=/root/.local/bin:$PATH CMD ["python", "app.py"]
Click to reveal answer
What does the COPY --from=build command do in a multi-stage Dockerfile?
ACopies files from the current stage only
BCopies files from the host machine
CCopies files from a previous build stage named 'build'
DCopies files from the internet
Why are multi-stage builds useful for ML projects?
AThey increase image size for better performance
BThey reduce image size by excluding build dependencies
CThey allow running multiple containers at once
DThey automatically train ML models
Which Dockerfile instruction starts a new build stage?
AFROM
BRUN
CCOPY
DCMD
What is a key advantage of smaller Docker images in production?
AFaster startup and less storage use
BMore CPU usage
CLonger build times
DMore network traffic
In multi-stage builds, where do you put build tools like compilers?
AOn the host machine
BIn the final stage
CIn a separate container
DIn the early stages only
Explain how multi-stage builds help reduce Docker image size and why this matters in MLOps.
Think about separating build environment from runtime environment.
You got /5 concepts.
    Describe the steps to create a multi-stage Dockerfile for a Python ML application.
    Focus on splitting build and runtime in Dockerfile.
    You got /5 concepts.

      Practice

      (1/5)
      1. What is the main benefit of using multi-stage builds in Docker?
      easy
      A. They enable Docker images to run on any operating system without modification.
      B. They create smaller and cleaner Docker images by separating build and runtime stages.
      C. They automatically update the base image to the latest version.
      D. They allow running multiple containers simultaneously.

      Solution

      1. Step 1: Understand multi-stage build concept

        Multi-stage builds separate the build environment from the runtime environment in Dockerfiles.
      2. Step 2: Identify the benefit of separation

        This separation removes unnecessary build tools from the final image, making it smaller and cleaner.
      3. Final Answer:

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

        Multi-stage builds = smaller images [OK]
      Hint: Multi-stage builds reduce image size by splitting build and runtime [OK]
      Common Mistakes:
      • Confusing multi-stage builds with running multiple containers
      • Thinking multi-stage builds update base images automatically
      • Assuming multi-stage builds change OS compatibility
      2. Which of the following is the correct syntax to start a new stage named 'builder' in a Dockerfile?
      easy
      A. FROM ubuntu AS builder
      B. STAGE builder FROM ubuntu
      C. NEW STAGE builder FROM ubuntu
      D. BUILD STAGE builder FROM ubuntu

      Solution

      1. Step 1: Recall Dockerfile multi-stage syntax

        To start a new build stage, Dockerfile uses 'FROM <image> AS <name>'.
      2. Step 2: Match correct syntax

        Only 'FROM ubuntu AS builder' matches the correct syntax for naming a stage.
      3. Final Answer:

        FROM ubuntu AS builder -> Option A
      4. Quick Check:

        Stage naming uses 'FROM ... AS ...' [OK]
      Hint: Use 'FROM image AS name' to start a new build stage [OK]
      Common Mistakes:
      • Using 'STAGE' keyword which does not exist
      • Writing 'NEW STAGE' instead of 'FROM ... AS ...'
      • Confusing 'BUILD STAGE' with Dockerfile syntax
      3. Given this Dockerfile snippet, what will be the size effect 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 fail to build due to missing Go compiler in the second stage.
      B. The final image will be large because it includes the entire Go build environment.
      C. The final image will be small because it only copies the built binary from the builder stage.
      D. The final image will include both Alpine and Go base images merged.

      Solution

      1. Step 1: Analyze multi-stage build steps

        The first stage builds the Go binary using the full Go environment. The second stage uses a minimal Alpine image.
      2. Step 2: Understand what is copied to final image

        Only the compiled binary '/app/myapp' is copied from the builder stage to the final image, excluding build tools.
      3. Final Answer:

        The final image will be small because it only copies the built binary from the builder stage. -> Option C
      4. Quick Check:

        Copying only binary = smaller final image [OK]
      Hint: Final image size shrinks by copying only needed files [OK]
      Common Mistakes:
      • Assuming the entire build environment is included in final image
      • Thinking the build fails due to missing compiler in second stage
      • Believing base images merge into one large image
      4. Identify the error in this Dockerfile snippet using multi-stage build:
      FROM node:18 AS builder
      WORKDIR /app
      COPY package.json .
      RUN npm install
      COPY . .
      RUN npm run build
      
      FROM node:18
      COPY --from=builder /app/dist ./dist
      CMD ["node", "./dist/server.js"]
      medium
      A. The COPY command in the second stage has incorrect source path syntax.
      B. The first stage is missing a WORKDIR declaration.
      C. The CMD command is missing square brackets for JSON array syntax.
      D. The second stage should use a smaller base image like 'node:18-alpine' to reduce size.

      Solution

      1. Step 1: Review base images used in both stages

        Both stages use 'node:18', which is a full Node image including build tools.
      2. Step 2: Suggest optimization for smaller final image

        Using a smaller base like 'node:18-alpine' in the second stage reduces image size by excluding unnecessary tools.
      3. Final Answer:

        The second stage should use a smaller base image like 'node:18-alpine' to reduce size. -> Option D
      4. Quick Check:

        Use lightweight base images in final stage [OK]
      Hint: Use lightweight base images in final stage for smaller images [OK]
      Common Mistakes:
      • Thinking COPY syntax is incorrect when it is valid
      • Believing CMD needs different syntax here
      • Assuming WORKDIR is missing in first stage
      5. You want to build a Python app with dependencies installed only during build, but keep the final image minimal. Which multi-stage Dockerfile snippet achieves this best?
      hard
      A.
      FROM python:3.12 AS builder
      WORKDIR /app
      COPY requirements.txt .
      RUN pip install -r requirements.txt
      COPY . .
      
      FROM python:3.12-slim
      COPY --from=builder /app /app
      CMD ["python", "/app/app.py"]
      B.
      FROM python:3.12
      WORKDIR /app
      COPY requirements.txt .
      RUN pip install -r requirements.txt
      COPY . .
      CMD ["python", "/app/app.py"]
      C.
      FROM python:3.12 AS builder
      WORKDIR /app
      COPY requirements.txt .
      RUN pip install -r requirements.txt
      COPY . .
      CMD ["python", "/app/app.py"]
      D.
      FROM python:3.12-slim
      WORKDIR /app
      COPY . .
      RUN pip install -r requirements.txt
      CMD ["python", "/app/app.py"]

      Solution

      1. Step 1: Understand requirement for minimal final image

        Dependencies should be installed in a build stage, not in the final image, to keep it small.
      2. Step 2: Analyze options for multi-stage usage

        FROM python:3.12 AS builder
        WORKDIR /app
        COPY requirements.txt .
        RUN pip install -r requirements.txt
        COPY . .
        
        FROM python:3.12-slim
        COPY --from=builder /app /app
        CMD ["python", "/app/app.py"]
        uses a builder stage to install dependencies and copies only the app to a slim final image, achieving minimal size.
      3. Final Answer:

        Option A correctly uses multi-stage build to keep final image minimal. -> Option A
      4. Quick Check:

        Install dependencies in builder, copy to slim final image [OK]
      Hint: Install dependencies in builder stage, copy only needed files to slim image [OK]
      Common Mistakes:
      • Installing dependencies directly in final image increasing size
      • Not using multi-stage build at all
      • Running app in builder stage instead of final stage