Bạn có biết?
Khi bạn build một ứng dụng Node.js, image hoàn chỉnh có thể nặng tới 1GB vì chứa cả source code, node_modules, dev dependencies và build tools. Nhưng thực tế, khi chạy production, bạn chỉ cần file đã build — vài MB mà thôi!
Multi-stage build giải quyết vấn đề này: tách quá trình build và runtime thành nhiều giai đoạn, chỉ giữ lại những gì cần thiết trong image cuối cùng.
Multi-stage Build là gì?
Multi-stage build cho phép bạn sử dụng nhiều FROM statements trong một Dockerfile. Mỗi FROM bắt đầu một stage mới, và bạn có thể copy kết quả từ stage trước sang stage sau.
# Stage 1: Build (nặng, chứa build tools)
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production (nhẹ, chỉ chứa kết quả)
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]
Kết quả: image cuối cùng không chứa source code, dev dependencies hay build tools — chỉ có file đã build!
So sánh image size
# Single-stage (không tối ưu)
$ docker build -t myapp:old .
$ docker images myapp:old
# REPOSITORY TAG SIZE
# myapp old 1.2GB
# Multi-stage (tối ưu)
$ docker build -t myapp:new .
$ docker images myapp:new
# REPOSITORY TAG SIZE
# myapp new 180MB
Các kỹ thuật tối ưu Dockerfile
1. Layer Caching — Tận dụng cache để build nhanh hơn
Docker cache từng layer riêng biệt. Nếu layer đầu tiên thay đổi, tất cả layer sau đó phải build lại. Thứ tự lệnh rất quan trọng!
# ❌ KHÔ ố ư — ỗ ầ đổ, à ạ Ấ Ả
:
/
. .
# ✅ Ố Ư — đượ ế ô đổ
:
/
* ./ # : ỉ
# : à (cached!)
. . # : (thay đổi thường xuyên)
0 bình luận
Đang tải bình luận...
Để lại bình luận