Docker· ~14 นาที
Multi-stage Build และลดขนาด Image
ทำ image ให้เล็ก เร็ว และสะอาดด้วย multi-stage
Multi-stage build เหมือนทำอาหารในครัวใหญ่แล้วยกเฉพาะจานเสร็จออกมาเสิร์ฟ — เครื่องมือ/วัตถุดิบ (compiler, dependency สำหรับ build) ทิ้งไว้ในครัว ไม่ติดไปกับจาน · image สุดท้ายจึงเล็กและสะอาด
ปัญหา: ถ้าใส่ทั้ง compiler + source + dependency ลง image เดียว มันจะใหญ่และมีของไม่จำเป็น (ช้าตอน pull, ผิวโจมตีกว้าง) · multi-stage แยกขั้น build ออกจากขั้น run แล้วก๊อปเฉพาะผลลัพธ์
# ---- stage 1: build (มีเครื่องมือครบ) ----
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build # ได้ผลลัพธ์ใน /app/dist
# ---- stage 2: run (image เล็ก เอาแค่ผลลัพธ์) ----
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
# ไม่มี node/npm/source ติดมา — เหลือแค่ไฟล์ที่เสิร์ฟจริง- เลือก base image เล็ก —
-alpineหรือ-slimเล็กกว่าปกติหลายเท่า - multi-stage — ทิ้งเครื่องมือ build ไว้ เอาแค่ผลลัพธ์ (artifact) เข้า image สุดท้าย
- รวมคำสั่ง RUN และล้าง cache ในบรรทัดเดียว เพื่อลด layer/ขนาด
- .dockerignore — กัน node_modules/.git ไม่ให้เข้า build context
สรุป Key Takeaways
- Multi-stage: แยก stage build (เครื่องมือครบ) จาก stage run (เอาแค่ผลลัพธ์)
- ใช้ base image เล็ก (alpine/slim) + .dockerignore
- image เล็ก → pull เร็ว, ประหยัด, attack surface น้อย
อ่านจบแล้วอย่าลืมทำเครื่องหมาย

