بناء تطبيق Go
Go هي أنظف حالة للبناء المتعدد المراحل. يُجمَّع برنامج Go إلى ملف ثنائي ساكن واحد، فلا تحتاج صورة التشغيل إلى شيء سوى ذلك الملف. ابنِ على صورة go، وانسخ الملف الثنائي إلى static، فتكون الصورة النهائية لا تزيد كثيرًا عن برنامجك: لا سلسلة أدوات، ولا غلاف، ولا مدير حزم.
يبني هذا على ghcr.io/quenchworks/images/go:1.25 وghcr.io/quenchworks/images/static. صورة static هي الصورة الوحيدة في الكتالوج الموسومة بـ :latest، لأنها لا تحمل إصدار لغة خاصًّا بها.
ملف Dockerfile ذو المرحلتين
# Build stage: compile a fully static binary.FROM ghcr.io/quenchworks/images/go:1.25 AS buildWORKDIR /src
# CGO off makes the binary static so it runs on the static base with no libc.# The root filesystem is read-only, so point the build caches at /tmp.ENV CGO_ENABLED=0 \ GOOS=linux \ GOCACHE=/tmp/gocache \ GOMODCACHE=/tmp/gomodcache
# Download modules first so the layer caches when only code changes.COPY go.mod go.sum ./RUN ["go", "mod", "download"]COPY . .RUN ["go", "build", "-trimpath", "-ldflags=-s -w", "-o", "/out/app", "./cmd/app"]
# Runtime stage: just the binary on the tiny static base.FROM ghcr.io/quenchworks/images/staticCOPY --from=build /out/app /appUSER 1001EXPOSE 8080ENTRYPOINT ["/app"]لماذا تبقى هذه صغيرة
- البناء. تحمل صورة
goسلسلة الأدوات الكاملة. ينتجCGO_ENABLED=0ملفًا ثنائيًا ساكنًا بلا اعتماد ديناميكي على libc، وهذا بالضبط ما يحتاجه أساسstatic. تذهب الذاكرات إلى/tmpلأن البناء يجري على نظام ملفات جذر للقراءة فقط. - التشغيل.
staticأساس أدنى به مستخدم بدون صلاحيات الجذر وشهادات CA، وليس بكثير غير ذلك. انسخ الملف الثنائي الواحد، واضبط نقطة الدخول، وتكون قد انتهيت. لا مُجمِّع ولا غلاف لتتركه خلفك.
التالي
- يعمل أساس
staticنفسه مع أي لغة تُجمَّع إلى ملف ثنائي ساكن، Rust منها؛ ابنِ بـghcr.io/quenchworks/images/rustوانسخ الملف الثنائي. - ثبّت بالبصمة الرقمية ليجري كل بناء بالضبط على الأساس الذي جرى فحصه وتوقيعه.