المستوى: مبتدئ — يكفي إنك تعرف Dockerfile بسيط وتعرف تشغّل docker build.
Distroless Docker للمبتدئ: قلّل حجم الـ Image بنسبة 84% وامنع 98% من CVEs
لو الـ image بتاع تطبيق Node.js عندك حجمه 1.13GB وعليه 167 ثغرة CVE مكتشفة، انت مش محتاج تنقل لـ alpine ولا slim. انت محتاج Distroless. هنا هتعرف ليه Google بتشحن خدماتها على الصور دي من سنة 2017، وإزاي تحوّل تطبيقك في Dockerfile من 8 سطور، وإيه التمن الحقيقي اللي بتدفعه مقابل المكسب.
المشكلة باختصار
لما بتعمل docker build على تطبيق Node.js بالطريقة العادية، Docker بيحط معاك توزيعة Debian كاملة: bash و apt و curl و perl و حوالي 200 مكتبة C. التطبيق نفسه ممكن يكون 4 ميجا كود، بس الـ image النهائي بيطلع 1.13GB. السبب إنك بتشحن نظام تشغيل كامل علشان تشغّل برنامج واحد.
المشكلة مش بس الحجم. كل أداة جوّا الـ image هي بوابة لمهاجم محتمل. لو حد وصل لـ shell جوّا الكونتينر، هيلاقي curl يبعت بياناتك بره، و wget ينزّل malware، و bash يكتب exploits. ولو الأدوات دي مش موجودة أصلاً، المهاجم بيقف عند أول خطوة.
تشبيه قبل التعريف العلمي
تخيل إنك بتشحن منتج صغير من مصنعك للعميل. الطريقة العادية: تحطّ المنتج في صندوق فيه برضو كتالوج المنتجات التانية وقائمة الأسعار وحتة من المخزن. الـ Distroless: الصندوق فيه المنتج بس. حتى مطواة الفتح مش موجودة. لو حد سرق الصندوق في الطريق، ما هيلاقيش ولا أداة يستخدمها، وما هيعرفش حتى إيه تاني عندك في المخزن.
التعريف العلمي: Distroless هو base image بيحتوي على dependencies اللي runtime تطبيقك محتاجها فقط — ومفيهوش shell ولا package manager ولا أي userland binaries إضافية. المشروع طلع من Google تحت GoogleContainerTools سنة 2017، وبيتشحن على gcr.io/distroless. الصورة بتحتوي على glibc و SSL certificates و timezone data، وبس. مفيش /bin/sh ولا /usr/bin/apt ولا حتى ls.
المثال التنفيذي — من 1.13GB لـ 187MB
افتح Dockerfile لتطبيق Node.js بسيط. الطريقة الشائعة:
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install --omit=dev
COPY . .
CMD ["node", "server.js"]
الحجم النهائي بعد build: 1.13GB. عدد الـ CVEs على trivy image: 167 (منهم 24 High وواحد Critical).
الطريقة الـ Distroless بـ multi-stage build: