Docker Image bị béo phì

Image có 2GB thôi, kéo lâu tí nhưng chạy ngon mà anh!
– Ngon đâu không thấy, chỉ thấy CI/CD chậm như rùa!

Audit Docker image mà thấy image nặng 2GB chỉ để chạy API Node.js, tôi thắc mắc: “Sao không dùng Alpine mà lại kéo cả Ubuntu?”. Layer chồng chất, node_modules nằm trong image, deploy như tải cả Netflix về.

Docker image khi dev dùng Ubuntu và nhét node_modules!

Image “béo phì”

Thực trạng:  
  • Base image sai: Dùng ubuntu thay vì alpine, nặng gấp 10 lần.  
  • Không multi-stage build: Tất cả build tools, cache, node_modules nhét vào image.  
  • Không audit: Dev không kiểm tra layer bằng docker history hay dive.
Hệ quả:  
  • Deploy chậm: Pull/push image mất hàng phút, CI/CD ì ạch.  
  • Tốn storage: Image nặng ngốn disk, cloud bill tăng.  
  • Rủi ro bảo mật: Layer thừa chứa dependency lỗi thời, dễ dính CVE.

Giải pháp: Tối ưu image

Để image “gọn nhẹ”:  
  • Dùng base image nhẹ: Chọn alpine hoặc distroless thay vì ubuntu.  
  • Multi-stage build: Tách build và runtime environment.  
  • Audit layer: Dùng dive <image> hoặc docker history để kiểm tra layer thừa.

Ví dụ: Multi-stage build cho Node.js

FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:18-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY package*.json ./
RUN npm ci --production
CMD ["node", "dist/index.js"]

🎯 Tóm lại: Image nặng là “gánh nặng” cho CI/CD. Dùng Alpine, multi-stage build, và audit layer để deploy nhanh, nhẹ, và tiết kiệm.

Post a Comment

Mới hơn Cũ hơn