Docker / أدلة البناء وعمليات الإنتاج / الدرس 13
البناء متعدد المراحل ومدخلات الإصدار القابلة للإعادة
افصل أدوات البناء عن مخرجات التشغيل وميّز الصورة الصغيرة من البناء القابل للإعادة.
في هذه الصفحة
أهداف الدرس
- تتبّع المراحل المسماة ونسخ المخرجات عبر مثال Go كامل.
- حدد مدخلات إعادة المحتوى والبناء الموثوق.
بيئة البناء ليست متطلب تشغيل
قد يلزم المترجم ومدير الحزم والمصدر لإنتاج التطبيق لا لخدمته. تفصل المراحل الجذور وتنسخ COPY --from المخرجات المطلوبة دون الأدوات كلها. يقل المحتوى والكشف، لكن ذلك لا يثبت الثقة أو سلامة الثغرات أو قابلية الإعادة؛ فحدود المراحل تحتاج مراجعة الاعتماديات والمصدر.
اجعل مثال البرنامج المترجم كاملاً
يقدم الدرس مثال Go مستقلاً بالمكتبة القياسية لا تعديلاً خفياً لبرنامج Python. يوضع الملفان في مجلد مصدر مؤقت جديد. يعيد parcel-go على 8080 ولا يستورد وحدات خارجية، ومسار الوحدة اصطناعي. يحدد الملفان المدخل دون افتراض ملف تنفيذي مبني مسبقاً.
module example.test/parcel
go 1.26
يطلب التوجيه خط أساس Go1.26 ويجب أن تفي الصورة به. لا توجد وحدات خارجية، فلا نحتاج بصمات مخترعة أو حزماً محلولة من الشبكة.
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "parcel-go")
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
يبقى الخادم في المقدمة ويعيد parcel-go. يُعرض المصدر للشرح فقط دون ادعاء ترجمة أو بناء أو طلب ناجح. تحتاج الخدمة الحقيقية أيضاً مهلات وإغلاقاً خارج هذا المثال الأدنى.
انسخ مخرج التشغيل المقصود فقط
تبني المرحلة التنفيذية مع تعطيل CGO وتضعه في مسار معلوم، وتتلقى scratch الملف وحده. تتجنب الهوية الرقمية الحاجة إلى قاعدة مستخدمين، ولا يلزم غلاف صدفي للبدء. تفتقد scratch الصدفة ومدير الحزم وشهادات الثقة والتوقيت؛ فعلى المحتاج توفيرها أو اختيار أساس آخر.
# syntax=docker/dockerfile:1
FROM golang:1.26-alpine AS build
WORKDIR /src
COPY go.mod main.go ./
RUN CGO_ENABLED=0 go build -trimpath -o /out/parcel ./
FROM scratch AS runtime
COPY --from=build /out/parcel /parcel
USER 65532:65532
EXPOSE 8080
ENTRYPOINT ["/parcel"]
تقرأ COPY الملف من مرحلة build وتضعه عند /parcel ويشير ENTRYPOINT إليه. يظل وسم الأداة متغيراً، فلا ندعي تطابق بايتات الإصدار قبل تثبيت البصمة والأداة والمصدر وبقية المدخلات.
ثبت الهوية دون إيقاف تحديث الأمان
تتطلب الإعادة ضبط المصدر والبصمات والأقفال والأدوات والمعاملات والمنصة والبيئة. قد تجلب وصفة تبدو حتمية محتوى متغيراً. يتيح التثبيت المقارنة ويحتاج سياسة تحديث. خذ البصمات الحقيقية من مصدر موثوق ولا تختلقها لتجميل المثال، وقارن البناء المنضبط قبل الادعاء.
افحص المخرجات عند حد المرحلة
افحص المسار والمعمارية والاعتماديات والهوية والشبكة وغياب ملفات البناء والأسرار. قد يصعب تشخيص الصورة الصغيرة؛ فخطط للمراقبة والتشخيص المعتمد لا إضافة صدفة بعد الإصدار. احفظ صلة المصدر بالمخرج والفحوص مع البصمة ليختار التراجع محتوى معلوماً.
الأخطاء الشائعة وإصلاحها
تقرأ COPY --from مرحلة خاطئة أو مخرجاً مفقوداً.
- لماذا يحدث؟
- يختلف الاسم أو المسار عن وجهة المترجم.
- كيف تصلحه؟
- طابق المرحلة والموضع قبل تغيير الأساس.
- كيف تتجنب تكراره؟
- عامل المسارات كعقود بين المراحل.
يفشل تنفيذ scratch لغياب اعتماد تشغيل.
- لماذا يحدث؟
- لم يكن الملف مستقلاً أو احتاج شهادات أو بيانات.
- كيف تصلحه؟
- راجع الربط والملفات ووفر المعتمد فقط.
- كيف تتجنب تكراره؟
- اختبر الصورة النهائية لا مرحلة البناء فقط.
تعطي إعادة الوصفة محتوى مختلفاً.
- لماذا يحدث؟
- تغيرت الوسوم أو الشبكة أو المنصة أو البيئة.
- كيف تصلحه؟
- سجل كل المدخلات واضبطها قبل التشخيص.
- كيف تتجنب تكراره؟
- افصل دليل الإعادة عن ادعاء الحجم.
اختبر فهمك
1. هل تنسخ COPY --from=build /out/parcel /parcel المترجم أيضاً؟
اعرض الحل المشروح
لا؛ تختار ذلك المخرج فقط، ولا ترث scratch أدوات المرحلة. وقد يحتاج التطبيق بيانات أو مكتبات، ويجب تقييمها مستقلة عن النسخ.
2. لماذا لا تثبت-trimpath وحدها قابلية الإعادة؟
اعرض الحل المشروح
تزيل بعض معلومات المسار ولا تثبت المترجم أو الأساس أو المصدر أو الاعتماديات أو المنصة. يحتاج الادعاء مدخلات مضبوطة ومقارنة فعلية لا خياراً واعداً واحداً.
أهم ما تعلمته
- تقلل المراحل محتوى التشغيل وتوضح المسؤولية.
- الإعادة خاصية مدخلات وأدلة لا تسمية حجم.