Named build stages in Docker - Time & Space Complexity
We want to understand how the time to build a Docker image changes when using named build stages.
Specifically, how does the build time grow as the number of stages or commands increases?
Analyze the time complexity of the following Dockerfile snippet using named build stages.
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
This Dockerfile builds a Node.js app in one stage, then copies the build output to a smaller image in the final stage.
Look for repeated steps or commands that affect build time.
- Primary operation: Running commands like
npm installandnpm run buildinside the builder stage. - How many times: Each command runs once per build stage; no loops or recursion here.
As the number of build stages or commands increases, the total build time grows roughly by adding each command's time.
| Input Size (n) | Approx. Operations |
|---|---|
| 2 stages, 3 commands | 3 command runs + 1 copy |
| 5 stages, 10 commands | 10 command runs + 4 copies |
| 10 stages, 20 commands | 20 command runs + 9 copies |
Pattern observation: Build time grows roughly linearly with the number of commands and stages.
Time Complexity: O(n)
This means build time increases in a straight line as you add more commands or stages.
[X] Wrong: "Using named build stages makes the build time stay the same no matter how many stages there are."
[OK] Correct: Each stage runs its commands fully, so more stages or commands add more work and time.
Understanding how build stages affect build time helps you explain Dockerfile efficiency clearly and shows you can reason about build processes.
"What if we cached the results of some stages? How would that change the time complexity?"
Practice
named build stages in a Dockerfile?Solution
Step 1: Understand what named build stages do
Named build stages let you divide your Docker build into parts with names, making it easier to manage.Step 2: Recognize the benefit of reusing files
You can copy files from one named stage to another, which helps keep images smaller and cleaner.Final Answer:
To split the build process into parts and reuse files between them -> Option BQuick Check:
Named build stages = split and reuse [OK]
- Confusing named stages with running multiple containers
- Thinking named stages create multiple Dockerfiles
- Believing named stages update images automatically
Solution
Step 1: Recall Dockerfile syntax for naming stages
The correct syntax uses theFROMinstruction followed by the image andASplus the stage name.Step 2: Check each option
Only FROM node:18 AS builder usesFROM node:18 AS builder, which is correct syntax.Final Answer:
FROM node:18 AS builder -> Option CQuick Check:
Named stage syntax = FROM ... AS ... [OK]
- Using BUILD or STAGE instead of FROM
- Omitting the AS keyword
- Using WITH instead of AS
FROM node:18 AS builder RUN npm install FROM node:18 COPY --from=builder /app/node_modules /app/node_modules
Solution
Step 1: Understand multi-stage build effect on image size
Multi-stage builds copy only required files from earlier stages, reducing final image size.Step 2: Analyze the COPY --from usage
The final stage copies only/app/node_modulesfrom the builder, not the whole builder image.Final Answer:
Smaller, because only needed files are copied from builder -> Option AQuick Check:
Multi-stage copy reduces image size [OK]
- Assuming both stages are fully included in final image
- Thinking same base image means same size
- Confusing syntax causing build failure
FROM python:3.12 AS build RUN pip install -r requirements.txt FROM python:3.12 COPY --from=builder /app /app
Solution
Step 1: Check stage names consistency
The first stage is namedbuild, but COPY uses--from=builder, which is incorrect.Step 2: Understand COPY --from usage
The--frommust match the exact stage name to copy files correctly.Final Answer:
The stage name 'build' is misspelled as 'builder' in COPY -> Option AQuick Check:
Stage name mismatch causes COPY error [OK]
- Assuming COPY can't copy between stages
- Ignoring stage name spelling
- Thinking RUN is required in second stage
Solution
Step 1: Identify multi-stage build for compiling and 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"]
uses a builder stage with golang image to compile, then copies only the binary to a small alpine image.Step 2: Check other options for correctness
FROM alpine:latest AS builder RUN apk add go WORKDIR /app COPY . . RUN go build -o myapp FROM golang:1.20 COPY --from=builder /app/myapp /usr/local/bin/myapp CMD ["myapp"]
installs Go in alpine, which is less efficient. Single-stage builds do not use multi-stage builds, so final image is large.Final Answer:
Uses golang:1.20 AS builder to compile and alpine:latest for the final binary-only image -> Option DQuick Check:
Multi-stage build with builder and final stage =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"]
[OK]
- Installing build tools in final image
- Not using multi-stage build
- Copying entire source instead of just binary
Ready to prove it?
Pass the test and this pattern moves unknown
