📖 Scenario: You are working on a Docker project where the final image size is too large. Large images take longer to download and use more storage. Your goal is to reduce the final Docker image size by 80% using best practices.
🎯 Goal: Build a Dockerfile that creates a small final image by using a multi-stage build and a minimal base image.
📋 What You'll Learn
Create a Dockerfile with a multi-stage build
Use python:3.12-slim as the base image in the first stage
Use python:3.12-alpine as the base image in the final stage
Copy only necessary files from the build stage to the final stage
Install only required dependencies in the final image
Print the final image size after building
💡 Why This Matters
🌍 Real World
Reducing Docker image size helps in faster deployments, less storage use, and better performance in cloud environments.
💼 Career
DevOps engineers and developers often optimize Docker images to improve CI/CD pipelines and production deployments.
Progress0 / 4 steps
1
Create the initial Dockerfile with a base image
Create a Dockerfile starting with the base image python:3.12-slim using the FROM instruction.
Docker
Hint
Use the FROM keyword followed by python:3.12-slim to specify the base image.
2
Add a build stage with dependencies installation
Add a build stage named builder using FROM python:3.12-slim AS builder. Then add a line to install pip packages flask and requests using RUN pip install flask requests.
Docker
Hint
Use AS builder to name the stage. Use RUN pip install flask requests to install packages.
3
Create the final minimal image stage
Add a final stage starting with FROM python:3.12-alpine. Copy the installed packages from the builder stage using COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages. Also copy the /usr/local/bin folder from builder to the final image. Set the default command to python3.
Docker
Hint
Use COPY --from=builder to copy files from the build stage. Use CMD ["python3"] to set the default command.
4
Build the image and print its size
Build the Docker image with tag small-python-app using docker build -t small-python-app .. Then run docker images small-python-app --format "{{.Size}}" to print the final image size.
Docker
Hint
Use docker build -t small-python-app . to build. Use docker images small-python-app --format "{{.Size}}" to show size.
Practice
(1/5)
1. What is the main benefit of using multi-stage builds in Docker to reduce image size?
easy
A. It allows copying only necessary files to the final image, reducing size.
B. It speeds up the build process by running all commands in one stage.
C. It automatically compresses the image layers without manual steps.
D. It enables running multiple containers from one image simultaneously.
Solution
Step 1: Understand multi-stage builds purpose
Multi-stage builds let you use one stage to build your app and another to create a smaller final image.
Step 2: Identify how size is reduced
By copying only the needed files from the build stage to the final stage, unnecessary build tools and files are excluded.
Final Answer:
It allows copying only necessary files to the final image, reducing size. -> Option A
Quick Check:
Multi-stage builds copy only needed files [OK]
Hint: Remember: multi-stage copies only needed files [OK]
Confusing multi-stage with running multiple containers
2. Which Dockerfile syntax correctly starts a multi-stage build with a small final image?
easy
A. FROM node:18-slim
RUN npm install
COPY /app /app
B. FROM node:18-slim AS build
RUN npm install
FROM node:18
COPY --from=build /app /app
C. FROM node:18
RUN npm install
COPY /app /app
D. FROM node:18 AS build
RUN npm install
FROM node:18-slim
COPY --from=build /app /app
Solution
Step 1: Identify multi-stage build syntax
Multi-stage builds use 'AS' to name stages and 'COPY --from=stage' to copy files.
Step 2: Check base images for build and final stages
FROM node:18 AS build
RUN npm install
FROM node:18-slim
COPY --from=build /app /app uses full node image for build and smaller node:18-slim for final, which reduces size.
Final Answer:
FROM node:18 AS build
RUN npm install
FROM node:18-slim
COPY --from=build /app /app -> Option D
Quick Check:
Correct multi-stage syntax with smaller final image [OK]
Hint: Use 'AS' to name build stage and copy from it [OK]
Common Mistakes:
Not using 'AS' to name build stage
Using larger base image in final stage
Copying files without specifying source stage
3. Given this Dockerfile snippet, what will be the approximate size difference between the final image and the build stage image?
FROM golang:1.20 AS build
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine:latest
COPY --from=build /app/myapp /myapp
CMD ["/myapp"]
medium
A. Final image is about 80% smaller than the build image.
B. Final image is larger than the build image.
C. Final image and build image are about the same size.
D. Final image is about 20% smaller than the build image.
Solution
Step 1: Analyze base images used
The build stage uses golang:1.20 (large image with build tools), final uses alpine (very small).
Step 2: Understand what is copied to final image
Only the compiled binary is copied, excluding all build dependencies, drastically reducing size.
Final Answer:
Final image is about 80% smaller than the build image. -> Option A
Quick Check:
Copying only binary to alpine reduces size ~80% [OK]
Hint: Copy only binary to tiny base image for big size drop [OK]
Common Mistakes:
Assuming final image includes build tools
Thinking final image is bigger due to alpine
Believing size difference is minimal
4. You wrote this Dockerfile to reduce image size but the final image is still large:
FROM python:3.12 AS build
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
FROM python:3.12
COPY --from=build /app /app
CMD ["python", "/app/app.py"]
What is the main issue causing the large final image?
medium
A. You forgot to run pip install in the final stage.
B. The final stage uses the full python:3.12 image instead of a smaller base.
C. COPY command syntax is incorrect and copies nothing.
D. The requirements.txt file is missing in the build stage.
Solution
Step 1: Check base images in build and final stages
Both stages use python:3.12, which is a large image; no size reduction from multi-stage.
Step 2: Identify how to reduce size
Using a smaller base like python:3.12-slim or alpine in the final stage reduces image size significantly.
Final Answer:
The final stage uses the full python:3.12 image instead of a smaller base. -> Option B
Quick Check:
Final stage base image too large [OK]
Hint: Use smaller base image in final stage to shrink size [OK]
Common Mistakes:
Thinking pip install must run in final stage
Assuming COPY syntax is wrong
Believing requirements.txt missing causes large image
5. You want to reduce your Docker image size by 80%. Your app requires Node.js to build but only needs the compiled files to run. Which Dockerfile approach best achieves this?
hard
A. Use multi-stage build: first stage with node:alpine to build, second stage with node:latest to run.
B. Use a single stage with node:latest and delete node_modules after build.
C. Use multi-stage build: first stage with full node image to build, second stage with node:alpine copying only build output.
D. Use a single stage with node:alpine and install build tools at runtime.
Solution
Step 1: Understand build and runtime needs
Building requires full Node.js image with tools; running only needs compiled files and a small base.
Step 2: Choose multi-stage build with appropriate images
First stage uses full node image to build; second stage uses smaller node:alpine image copying only build output to reduce size.
Final Answer:
Use multi-stage build: first stage with full node image to build, second stage with node:alpine copying only build output. -> Option C
Quick Check:
Multi-stage with full build image and small runtime image [OK]
Hint: Build with full image, run with small image copying only output [OK]
Common Mistakes:
Using single stage and deleting files later
Building on small image lacking tools
Running on large image unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.