صور Tiny Docker التي تؤمن بنفسها*

[إشارة إلى حكاية الأطفال الأمريكية الخيالية "المحرك الصغير الذي يمكنه" - تقريبًا. خط]*

صور Tiny Docker التي تؤمن بنفسها*

كيفية إنشاء صور Docker صغيرة تلقائيًا لتلبية احتياجاتك

هوس غير عادي

على مدى الشهرين الماضيين، كنت مهووسًا بمدى صغر حجم صورة Docker وما زال التطبيق قيد التشغيل؟

أفهم أن الفكرة غريبة.

قبل أن أخوض في التفاصيل والجوانب الفنية، أود أن أشرح لماذا أزعجتني هذه المشكلة كثيرًا، وكيف أنها تهمك.

لماذا يهم الحجم

ومن خلال تقليل محتويات صورة Docker، فإننا بذلك نقلل من قائمة نقاط الضعف. بالإضافة إلى ذلك، فإننا نجعل الصور أكثر وضوحًا، لأنها تحتوي فقط على ما هو مطلوب لتشغيل التطبيقات.

هناك ميزة صغيرة أخرى - يتم تنزيل الصور بشكل أسرع قليلا، ولكن في رأيي، هذا ليس مهما للغاية.

يرجى ملاحظة ما يلي: إذا كنت مهتمًا بالحجم، فإن مظهر جبال الألب في حد ذاته صغير ومن المرجح أن يناسبك.

صور خالية من التوزيع

مشروع ديستروليس يقدم مجموعة مختارة من الصور الأساسية "غير الموزعة"، فهي لا تحتوي على مديري الحزم والأصداف والأدوات المساعدة الأخرى التي اعتدت رؤيتها في سطر الأوامر. ونتيجة لذلك، استخدم مديري الحزم مثل pip и apt لن يعمل:

FROM gcr.io/distroless/python3
RUN  pip3 install numpy

Dockerfile باستخدام صورة Python 3 بدون توزيع

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 ميجابايت. ليس سيئا جدا! للمقارنة: صورة Python الافتراضية تزن 929 ميجابايت، والصورة "الأرق" (3,7-slim) - 179 ميجابايت، صورة جبال الألب (3,7-alpine) يبلغ حجمها 98,6 ميجابايت، في حين أن حجم الصورة الأساسية غير الموزعة المستخدمة في المثال هو 50,9 ميجابايت.

من العدل أن نشير إلى أننا في المثال السابق نقوم بنسخ دليل كامل /usr/local/lib/python3.7/site-packages، والتي قد تحتوي على تبعيات لا نحتاجها. على الرغم من أنه من الواضح أن اختلاف الحجم بين جميع صور Python الأساسية الموجودة يختلف.

في وقت كتابة هذا التقرير، لم يكن Google distroless يدعم العديد من الصور: لا تزال Java وPython في المرحلة التجريبية، وPython موجودة فقط للإصدارين 2,7 و3,5.

صور صغيرة

العودة إلى هوسي بإنشاء صور صغيرة.

بشكل عام، أردت أن أرى كيف يتم بناء الصور الخالية من التوزيع. يستخدم المشروع distroless أداة البناء من Google bazel. ومع ذلك، فإن تثبيت Bazel وكتابة صورك الخاصة استغرق الكثير من العمل (ولأكون صادقًا، فإن إعادة اختراع العجلة أمر ممتع وتعليمي). أردت تبسيط إنشاء صور أصغر حجمًا: يجب أن تكون عملية إنشاء الصورة بسيطة للغاية، عادي. بحيث لا توجد ملفات تكوين لك، فقط سطر واحد في وحدة التحكم: просто собрать образ для <приложение>.

لذا، إذا كنت تريد إنشاء صورك الخاصة، فاعلم: أن هناك صورة فريدة من نوعها لعامل الإرساء، scratch. Scratch هي صورة "فارغة"، ولا توجد ملفات فيها، على الرغم من وزنها الافتراضي - واو! - 77 بايت.

FROM scratch

صورة خدش

تتمثل فكرة الصورة المؤقتة في أنه يمكنك نسخ أي تبعيات من الجهاز المضيف إليها وإما استخدامها داخل ملف Dockerfile (وهذا يشبه نسخها إلى apt والتثبيت من البداية)، أو لاحقًا عندما تتحقق صورة Docker. يتيح لك ذلك التحكم الكامل في محتويات حاوية Docker، وبالتالي التحكم بشكل كامل في حجم الصورة.

الآن نحن بحاجة إلى جمع هذه التبعيات بطريقة أو بأخرى. الأدوات الموجودة مثل apt تسمح لك بتنزيل الحزم، لكنها مرتبطة بالجهاز الحالي، وبعد كل شيء، لا تدعم Windows أو MacOS.

لذلك شرعت في إنشاء أداتي الخاصة التي يمكنها تلقائيًا إنشاء صورة أساسية بأصغر حجم ممكن وتشغيل أي تطبيق أيضًا. لقد استخدمت حزم Ubuntu/Debian، وقمت بالاختيار (الحصول على الحزم مباشرة من المستودعات) ووجدت تبعياتها بشكل متكرر. وكان من المفترض أن يقوم البرنامج تلقائيًا بتنزيل أحدث إصدار ثابت من الحزمة، مما يقلل من المخاطر الأمنية قدر الإمكان.

لقد قمت بتسمية الأداة fetchy، لأنه... يجد ويجلب... الحاجة [من الانجليزية "جلب" و"إحضار" - تقريبًا. خط]. تعمل الأداة من خلال واجهة سطر الأوامر، ولكنها تقدم في الوقت نفسه واجهة برمجة التطبيقات (API).

لتجميع الصورة باستخدام fetchy (لنأخذ صورة بايثون هذه المرة)، كل ما عليك فعله هو استخدام واجهة سطر الأوامر (CLI) كما يلي: fetchy dockerize python. قد يُطلب منك نظام التشغيل المستهدف والاسم الرمزي لأنه fetchy يستخدم حاليًا فقط الحزم المستندة إلى Debian وUbuntu.

يمكنك الآن اختيار التبعيات غير المطلوبة على الإطلاق (في سياقنا) واستبعادها. على سبيل المثال، تعتمد لغة Python على لغة Perl، على الرغم من أنها تعمل بشكل جيد دون تثبيت لغة Perl.

النتائج

تم إنشاء صورة بايثون باستخدام الأمر fetchy dockerize python3.5 يزن 35 ميجابايت فقط (أنا متأكد من أنه يمكن جعله أخف وزنًا في المستقبل). اتضح أننا تمكنا من إزالة 15 WW أخرى من الصورة غير الموزعة.

يمكنك رؤية جميع الصور التي تم جمعها حتى الآن هنا.

مشروع - هنا.

إذا كنت تفتقد بعض الميزات، فما عليك سوى إنشاء طلب - وسأكون سعيدًا بمساعدتك :) والأكثر من ذلك، أنا أعمل حاليًا على دمج مديري الحزم الآخرين في الجلب، بحيث لا تكون هناك حاجة للبنيات متعددة المراحل.

المصدر: www.habr.com

إضافة تعليق