[إشارة إلى حكاية الأطفال الأمريكية الخيالية "The Little Engine That could" - تقريبا. لكل.] *

كيفية إنشاء صور عامل ميناء صغيرة بشكل تلقائي لتلبية احتياجاتك
هاجس غير عادي
خلال الشهرين الماضيين ، كنت مهووسًا بهوس: كم يمكنني تقليل صورة Docker حتى يعمل التطبيق؟
أنا أفهم أن الفكرة غريبة.
قبل الخوض في التفاصيل والحروف التقنية ، أود أن أشرح سبب ربطي بهذه المشكلة كثيرًا وكيف تهمك.
لماذا يهم الحجم
عن طريق تقصير محتويات صورة Docker ، نقوم بتقصير قائمة الثغرات الأمنية. بالإضافة إلى ذلك ، نجعل الصور أكثر نظافة ، لأنها تحتوي فقط على ما تحتاجه لتشغيل التطبيقات.
هناك ميزة أخرى صغيرة - يتم تنزيل الصور بشكل أسرع قليلاً ، لكن بالنسبة لي ، هذا ليس مهمًا جدًا.
يرجى ملاحظة: إذا كنت تهتم بالحجم ، تبدو جبال الألب صغيرة في حد ذاتها وربما تناسبك.
صور غير متحولة
يقدم مشروع Distroless مجموعة من الصور الأساسية "distroless" ؛ فهي لا تحتوي على مديري الحزم أو الأصداف أو الأدوات المساعدة الأخرى التي اعتدت رؤيتها على سطر الأوامر. نتيجة لذلك ، سيفشل استخدام مديري الحزم مثل pip
و apt
:
FROM gcr.io/distroless/python3 RUN pip3 install numpy
Dockerfile باستخدام صورة بيثون 3 distroless
Sending build context to Docker daemon 2.048kB Step 1/2 : FROM gcr.io/distroless/python3 ---> 556d570d5c53 Step 2/2 : RUN pip3 install numpy ---> Running in dbfe5623f125 /bin/sh: 1: pip3: not found
لا نقطة في الصورة
عادة ، يتم حل هذه المشكلة عن طريق بناء متعدد المراحل:
FROM python:3 as builder RUN pip3 install numpy FROM gcr.io/distroless/python3 COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/
التجمع متعدد المراحل
والنتيجة هي صورة بحجم 130 ميغابايت. ليس سيئا للغاية! للمقارنة: تزن صورة بيثون افتراضيًا 929 ميجابايت ، وصورة "أرق" ( 3,7-slim
) - 179 ميجابايت ، وصورة ألباين ( 3,7-alpine
) - 98.6 ميجابايت ، في حين أن الصورة الأساسية غير المعتادة المستخدمة في المثال هي 50،9MV.
يمكننا أن نشير بحق إلى أننا في المثال السابق ، نقوم بنسخ الدليل / /usr/local/lib/python3.7/site-packages
بأكمله ، والذي قد يحتوي على تبعيات غير ضرورية لنا. على الرغم من أنه من الواضح أن اختلاف حجم جميع الصور الأساسية الحالية لـ Python يختلف.
في وقت كتابة هذه السطور ، لا تدعم Google distroless العديد من الصور: لا تزال Java و Python في المرحلة التجريبية ، و Python موجود فقط لمدة 2.7 و 3.5.
صور صغيرة
دعنا نعود إلى هاجسي بإنشاء صور صغيرة.
في الواقع ، أردت أن أرى كيف تعمل الصور غير المشوهة. يستخدم مشروع distroless bazel
بناء bazel من Google. ومع ذلك ، لتثبيت Bazel وكتابة صورك الخاصة ، اضطررت إلى العرق (ولكي أكون صادقًا تمامًا ، فإن إعادة اختراع العجلة ممتعة ومفيدة). أردت أن أبسط إنشاء صور مخفضة: فعل إنشاء صورة يجب أن يكون بسيطًا للغاية ، عاديًا . بحيث لا يوجد لديك أي ملفات تهيئة ، هناك سطر واحد فقط في وحدة التحكم: <>
.
لذا ، إذا كنت تريد إنشاء صورك الخاصة ، فاعلم: هناك scratch
فريد من نوعه لرسو السفن. Scratch هي صورة "فارغة" ، لا تحتوي على ملفات ، على الرغم من وزنها افتراضيًا - نجاح باهر! - 77 بايت.
FROM scratch
خدش الصورة
تتمثل فكرة الصورة المخدرة في أنه يمكنك نسخ أي تبعيات من الجهاز المضيف إليها واستخدامها داخل Dockerfile (هذه هي كيفية نسخها إلى مكان apt
وتثبيتها من نقطة الصفر) ، أو في وقت لاحق ، عندما تتحقق صورة Docker. يتيح لك ذلك التحكم الكامل في محتويات حاوية Docker ، وبالتالي التحكم الكامل في حجم الصورة.
والآن نحن بحاجة إلى جمع هذه التبعيات بطريقة أو بأخرى. تسمح لك الأدوات الموجودة مثل apt
بتنزيل الحزم ، لكنها مرتبطة بالجهاز الحالي ، وفي النهاية ، لا تدعم Windows أو MacOS.
ولذا تعهدت بتجميع الأداة الخاصة بي ، والتي ستقوم تلقائيًا بتجميع الصورة الأساسية لأصغر حجم ممكن ، بحيث لا يزال بإمكانها تشغيل أي تطبيق. استخدمت حزم Ubuntu / Debian ، وقمت بالاختيار (الحصول على الحزم مباشرة من المستودعات) ووجدت بشكل متكرر تبعياتها. يجب أن يقوم البرنامج تلقائيًا بتنزيل أحدث إصدار ثابت من الحزمة ، مما يقلل من المخاطر الأمنية.
اتصلت fetchy
، لأنها ... تكتشف وتجلب ... ما تحتاجه [ من اللغة الإنجليزية. "جلب" ، "جلب" - تقريبا. في. ]. تعمل الأداة من خلال واجهة سطر الأوامر ، ولكن في الوقت نفسه تقدم واجهة برمجة تطبيقات.
لبناء صورة باستخدام fetchy
(لنأخذ صورة Python هذه المرة) ، تحتاج فقط إلى استخدام CLI مثل هذا: fetchy dockerize python
. قد تتم مطالبتك بنظام التشغيل المستهدف واسم الكود ، حيث أن fetchy
يستخدم فقط الحزم المستندة إلى Debian و Ubuntu حتى الآن.
الآن يمكنك اختيار التبعيات غير المطلوبة على الإطلاق (في سياقنا) واستبعادها. على سبيل المثال ، يعتمد Python على perl ، على الرغم من أنه يعمل بشكل رائع دون تثبيت Perl.
النتائج
تزن صورة Python التي تم إنشاؤها باستخدام أمر fetchy dockerize python3.5
فقط (أنا أكثر من متأكد من أنه يمكن جعلها أسهل في المستقبل). اتضح أنه مع صورة غير منتظمة ، تمكنا من "حلق" 15 ميغابايت أخرى.
جميع الصور التي تم جمعها حاليا يمكن الاطلاع هنا .
المشروع هنا .
إذا لم يكن لديك وظائف كافية ، فما عليك سوى إنشاء تطبيق - سأكون سعيدًا بالمساعدة :) بل وأكثر من ذلك ، أنا أعمل حاليًا على دمج مديري الحزم الآخرين في عمليات الجلب ، بحيث لم تعد هناك حاجة إلى عمليات إنشاء متعددة المراحل.