مستوى المقال: محترف. زمن القراءة المتوقع: 9 دقائق.
لو الـ container بتاعك في الإنتاج مبني على node:20 أو python:3.12 الكاملة، فيه عندك 412 حزمة Linux أنت ما طلبتهاش، 187 منهم فيهم ثغرة CVE معروفة، و0% منهم ضروري لتشغيل تطبيقك. Distroless بيشيل bash و apt و كل user space ما عدا اللي تطبيقك بيحتاجه فعلاً، فالـ CVE count بينزّل من 187 لـ 24، وحجم الـ image من 1.1GB لـ 78MB.
ليه Distroless مش مجرد "صورة أصغر"
الـ developer العادي بيختار base image على أساس "اللي بيشتغل". FROM ubuntu:22.04 سهل، فيه bash، فيه curl، فيه أدوات debug. المشكلة إن كل أداة فيهم بتدخل في حساب الـ attack surface بتاعك. لو حد دخّل code execution في تطبيقك، أول حاجة هيدوّر عليها هي shell ليكتشف البيئة. وجود /bin/sh بيحوّل الثغرة من inert (مش قادرة تعمل حاجة) لـ active (بتقدر تدوّر، تحمّل، تخرج).
المشكلة باختصار
افترض إن عندك microservice مكتوب بـ Go، حجم الـ binary النهائي 14MB، شغّال على FROM golang:1.22-alpine. أنت بتنشره على Kubernetes في 12 namespace مختلف. لو فحصت الـ image بـ Trivy، هتلاقي:
- 9 ثغرات CRITICAL.
- 34 ثغرة HIGH.
- 112 ثغرة MEDIUM.
الكود بتاعك مش هو السبب — السبب إن alpine جايبة busybox و apk و musl libc و ca-certificates. كل واحد فيهم بيرفع الـ surface. الحل مش إنك تعمل apk update كل أسبوع — الحل إنك تشيل اللي مش محتاجه أصلاً.
المثال للمبتدئ: شنطة المسافر
تخيّل إنك مسافر يومين والشركة بتدفع غرامة على كل كيلو زيادة. الناس العاديين بياخدوا شنطة 23 كيلو فيها لابتوب، 4 قمصان، شواحن، كتاب، و"نشتري فلتر مياه احتياطي يا ابني". أنت لو بتفكّر زي Distroless هتاخد قميص واحد، الكاش، الجواز، شاحن. كلوّ بيخلّص الرحلة، لكن الفرق إن لو حد سرق الشنطة من الفندق، هو سرق قميص بدل ما يسرق لابتوب فيه شغل سنة كاملة.
مفهوم Distroless مش "خفّف الشنطة"، هو "ما تاخدش حاجة لو مش هتستخدمها فعلاً". الفرق دقيق لكنه جوهري: alpine "خفيفة"، distroless "ما فيهاش غير اللازم".
التعريف العلمي للـ Distroless
المصطلح طلع رسمياً من فريق Google عام 2017 في مشروع GoogleContainerTools/distroless على GitHub. التعريف الدقيق: صورة container ما فيهاش package manager، ولا shell، ولا أي binary غير اللي runtime اللغة بيحتاجه. gcr.io/distroless/static-debian12 مساحتها 2.4MB وفيها بس ca-certificates و tzdata و /etc/passwd فيه nonroot user و /etc/os-release. gcr.io/distroless/base بتزوّد عليها glibc و libssl لو تطبيقك C-linked.
الفلسفة مأخوذة من نظام Google's (المصدر: ورقة "Large-scale cluster management at Google with Borg"، Verma et al.، EuroSys 2015): اللي مش جزء من شغل الـ workload الحقيقي، ما يجيش معاه. الفرق بين و : فاضي تماماً ومش بيشتغل مع 90% من اللغات لأن مفيش حتى . بيدّيك الحد الأدنى الفعلي مع + + شهادات CA.