Copying from build stage to final stage in Docker - Time & Space Complexity
When building Docker images with multiple stages, copying files from one stage to another is common.
We want to understand how the time to copy grows as the number or size of files increases.
Analyze the time complexity of this Dockerfile snippet.
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/build /usr/share/nginx/html
This copies the build output from the build stage to the final image.
Look for repeated actions that affect time.
- Primary operation: Copying files from the build stage to the final stage.
- How many times: Once per file or directory copied during the COPY command.
The time to copy grows as the number and size of files increase.
| Input Size (number of files) | Approx. Operations (copy actions) |
|---|---|
| 10 | 10 copy operations |
| 100 | 100 copy operations |
| 1000 | 1000 copy operations |
Pattern observation: The copying time grows roughly in direct proportion to the number of files.
Time Complexity: O(n)
This means the time to copy grows linearly with the number of files copied.
[X] Wrong: "Copying from build stage is instant regardless of files."
[OK] Correct: Each file must be copied, so more files take more time.
Understanding how copying scales helps you reason about build times and image size in real projects.
What if we copied a single large file instead of many small files? How would the time complexity change?
Practice
COPY --from= in a multi-stage Docker build?Solution
Step 1: Understand multi-stage builds
Multi-stage builds allow you to create intermediate stages for building your app.Step 2: Purpose of COPY --from=
TheCOPY --from=command copies files from these intermediate stages into the final image, keeping it clean and small.Final Answer:
To copy files from a previous build stage to the final image -> Option BQuick Check:
COPY --from= copies from build stage [OK]
- Confusing COPY --from= with copying from host
- Thinking it copies files between containers
- Assuming it copies files back to build stage
/app/build/output.bin from a build stage named builder to the final image's /app directory?Solution
Step 1: Recall COPY --from= syntax
The correct syntax isCOPY --from=stage source_path destination_path.Step 2: Match the paths and stage name
COPY --from=builder /app/build/output.bin /app correctly uses--from=builderfollowed by source and destination paths.Final Answer:
COPY --from=builder /app/build/output.bin /app -> Option AQuick Check:
Correct COPY --from= syntax is COPY --from=stage src dst [OK]
- Placing --from= after source and destination
- Using colon syntax like builder:/path (invalid)
- Swapping source and destination paths
/app directory?
FROM node:18 AS builder WORKDIR /app RUN echo "build file" > build.txt FROM alpine COPY --from=builder /app/build.txt /app/
Solution
Step 1: Check build stage output
The builder stage creates/app/build.txtwith content "build file".Step 2: COPY from builder to final image
The final stage copies/app/build.txtfrom builder to/app/in the final image.Final Answer:
The filebuild.txtwith content "build file" -> Option CQuick Check:
File copied with content preserved [OK]
- Assuming directory is empty after copy
- Thinking file content is lost
- Assuming /app directory is missing
builder:
FROM golang:1.20 AS builder WORKDIR /app RUN go build -o myapp FROM alpine COPY /app/myapp --from=builder /usr/local/bin/myapp
Solution
Step 1: Check COPY command syntax
The correct syntax isCOPY --from=builder source destination. The flag must come before paths.Step 2: Identify error in given command
The command places--from=builderafter the source path, which is invalid syntax.Final Answer:
The --from=builder flag is placed after the source path -> Option AQuick Check:
--from= must come before source path [OK]
- Putting --from= after source path
- Forgetting to name the build stage
- Assuming destination path is invalid without checking
dist/app.tar.gz file. The final stage should only copy this archive and extract it to /app. Which Dockerfile snippet correctly copies and extracts the archive from the build stage named builder?Solution
Step 1: Verify COPY --from= syntax and source path
The builder stage (WORKDIR /src) createsdist/app.tar.gzat/src/dist/app.tar.gz. Correctly usesCOPY --from=builder /src/dist/app.tar.gz ./with--from=builderfirst and absolute source path.Step 2: Confirm extraction command and paths
Final stage WORKDIR/app, copy to./placesapp.tar.gzthere.RUN tar xzf app.tar.gzextracts correctly.Final Answer:
COPY --from=builder /src/dist/app.tar.gz ./\nRUN tar xzf app.tar.gz -> Option DQuick Check:
COPY --from= before source path, extract in correct directory [OK]
- Placing --from= after source path
- Using wrong source path like /dist/app.tar.gz instead of /src/dist/app.tar.gz
- Extracting archive from wrong directory
Ready to prove it?
Pass the test and this pattern moves unknown
