الدرس 21: Dockerfile المتقدم: البناء متعدد المراحل (Multi-Stage Builds)
إحدى المشاكل الشائعة هي أن تجميع الكود (على سبيل المثال، Java, Go, React) يتطلب صور أدوات كبيرة (SDKs، مصممات، حزم npm)، ولكن هذه الأدوات غير ضرورية في بيئة التشغيل النهائية.
المشكلة: الصور المنتفخة (Bloated Images)
إذا قمت بتجميع تطبيق Go في صورة Go قياسية، فستتضمن الصورة الناتجة النهائية سلسلة أدوات المصمم (compiler toolchain) والتبعيات بالكامل، مما يجعل الصورة كبيرة بشكل غير ضروري.
الحل: البناء متعدد المراحل (Multi-Stage Builds)
يسمح لك البناء متعدد المراحل بتحديد عبارات FROM متعددة في Dockerfile واحد. تقوم بنسخ القطع الأثرية الضرورية فقط (الملف الثنائي المجمع أو الملفات الثابتة النهائية) من مرحلة 'الباني' (builder) إلى مرحلة 'وقت التشغيل' (runtime) النهائية والخفيفة.
مثال: بناء تطبيق Go
dockerfile
--- المرحلة 1: مرحلة الباني ---
FROM golang:1.21-alpine AS builder
WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . .
تجميع الملف الثنائي الساكن
RUN CGO_ENABLED=0 go build -o /app/my_app .
--- المرحلة 2: مرحلة وقت التشغيل النهائية ---
استخدم صورة مصغرة (alpine) لا تتضمن المصمم
FROM alpine:latest
WORKDIR /root/
انسخ الملف الثنائي المجمع فقط من مرحلة 'builder'
COPY --from=builder /app/my_app .
تعريف الأمر التنفيذي النهائي
CMD ["./my_app"]
الفوائد:
- صور أصغر: تكون الصورة النهائية أصغر بكثير لأنها تحتوي فقط على الملف التنفيذي ومكتبات نظام التشغيل الضرورية.
- أمان مُحسَّن: سطح هجوم أقل نظراً لغياب أدوات التطوير عن صورة الإنتاج.