ข้ามไปเนื้อหาหลัก
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 ติดมา — เหลือแค่ไฟล์ที่เสิร์ฟจริง
multi-stage: stage build แยกจาก stage run
  • เลือก 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 น้อย
อ่านจบแล้วอย่าลืมทำเครื่องหมาย