[اشاره به داستان کودکان آمریکایی «موتور کوچکی که میتوانست» - یادداشت ترجمه]*

چگونه به صورت خودکار ایمیجهای کوچک داکر را برای نیازهای خود ایجاد کنیم؟
یک وسواس غیرمعمول
در چند ماه گذشته، این ایده ذهنم را مشغول کرده بود: یک تصویر داکر چقدر میتواند کوچکتر باشد و همچنان برنامه را به کار بیندازد؟
میفهمم، ایده عجیبی است.
قبل از اینکه وارد جزئیات و نکات فنی شوم، دوست دارم توضیح دهم که چرا این موضوع اینقدر توجه من را جلب کرده و چگونه بر شما تأثیر میگذارد.
چرا اندازه مهم است
با کاهش محتویات یک تصویر داکر، فهرست آسیبپذیریها را کاهش میدهیم. همچنین تصاویر را تمیزتر میکنیم، زیرا آنها فقط شامل موارد مورد نیاز برای اجرای برنامهها هستند.
یک مزیت کوچک دیگر هم وجود دارد - تصاویر کمی سریعتر دانلود میشوند، اما به نظر من این خیلی مهم نیست.
لطفا توجه داشته باشید: اگر نگران اندازه هستید، تصاویر Alpine خودشان کوچک هستند و احتمالاً برای شما مناسب خواهند بود.
تصاویر بدون دیسترول
مجموعهای از ایمیجهای پایهی «بدون نیاز به توزیع» را ارائه میدهد؛ آنها شامل مدیران بسته، پوستهها یا سایر ابزارهایی که به دیدن آنها در خط فرمان عادت دارید، نیستند. در نتیجه، استفاده از مدیران بستهای مانند pip и apt کار نخواهد کرد:
FROM gcr.io/distroless/python3
RUN pip3 install numpyداکرفایل با استفاده از یک ایمیج بدون توزیع پایتون ۳
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/مونتاژ چند مرحلهای
حجم تصویر حاصل ۱۳۰ مگابایت است. خیلی هم بد نیست! برای مقایسه، تصویر پیشفرض پایتون ۹۲۹ مگابایت و تصویر «کوچکتر» (3,7-slim) - ۱۷۹ مگابایت، تصویر آلپاین (3,7-alpine) — ۹۸.۶ مگابایت، در حالی که ایمیج پایه بدون دیستروت که در مثال استفاده شده ۵۰.۹ مگابایت است.
میتوان به درستی اشاره کرد که در مثال قبلی ما در حال کپی کردن کل یک دایرکتوری هستیم. /usr/local/lib/python3.7/site-packages، که ممکن است شامل وابستگیهایی باشد که ما به آنها نیازی نداریم. با این حال، واضح است که تفاوت اندازه بین تمام تصاویر پایه پایتون موجود، نوسان دارد.
در زمان نگارش این مطلب، توزیع گوگل از تصاویر زیادی پشتیبانی نمیکند: جاوا و پایتون هنوز در مرحله آزمایشی هستند و پایتون فقط برای نسخههای ۲.۷ و ۳.۵ موجود است.
تصاویر کوچک
بیایید به وسواس من در خلق تصاویر کوچک برگردیم.
در واقع میخواستم ببینم تصاویر distroless چگونه ساختار یافتهاند. پروژه distroless از ابزار ساخت گوگل استفاده میکند. bazelبا این حال، نصب Bazel و ایجاد تصاویر خودم کمی تلاش برد (و صادقانه بگویم، اختراع دوباره چرخ سرگرم کننده و آموزنده است). میخواستم ایجاد تصاویر کوچک شده را ساده کنم: عمل ایجاد یک تصویر باید بسیار ساده باشد، پیش پا افتادهبنابراین هیچ فایل پیکربندی برای شما وجود ندارد، فقط یک خط در کنسول: просто собрать образ для <приложение>.
بنابراین، اگر میخواهید ایمیجهای خودتان را ایجاد کنید، بدانید که یک ایمیج داکر منحصر به فرد وجود دارد، scratchاسکرچ یک تصویر «خالی» است؛ هیچ فایلی ندارد، هرچند که حجم پیشفرض آن—وای!—77 بایت است.
FROM scratchتصویر خراشیده
ایده پشت تصویر خراش این است که میتوانید هرگونه وابستگی را از دستگاه میزبان به آن کپی کنید و یا از آنها در داخل Dockerfile استفاده کنید (مثل کپی کردن آنها به apt و از ابتدا نصب کنید)، یا بعداً، پس از اینکه ایمیج داکر آماده شد. این امر امکان کنترل کامل بر محتویات کانتینر داکر و در نتیجه کنترل کامل بر اندازه ایمیج را فراهم میکند.
حالا باید به نحوی این وابستگیها را جمعآوری کنیم. ابزارهای موجود مانند apt به شما امکان دانلود بستهها را میدهند، اما آنها به دستگاه فعلی گره خوردهاند و در نهایت، از آنها پشتیبانی نمیکنند Windows یا مک او اس.
بنابراین تصمیم گرفتم ابزار خودم را بسازم که به طور خودکار یک تصویر پایه با کوچکترین اندازه ممکن ایجاد کند و هر برنامهای را اجرا کند. من از بستهها استفاده کردم Ubuntu/Debian، یک انتخاب (بازیابی مستقیم بستهها از مخازن) انجام داد و به صورت بازگشتی وابستگیهای آنها را پیدا کرد. قرار بود این برنامه به طور خودکار آخرین نسخه پایدار بسته را دانلود کند و خطرات امنیتی را به حداقل برساند.
من اسم ساز رو گذاشتم fetchyزیرا او... آنچه را که لازم است پیدا میکند و میآورد... [از انگلیسی «fetch»، «آوردن» — ترجمه. noteاین ابزار از طریق رابط خط فرمان کار میکند، اما یک API نیز ارائه میدهد.
برای مونتاژ تصویر با استفاده از fetchy (بیایید این بار یک تصویر پایتون بگیریم)، فقط باید از CLI به این شکل استفاده کنید: fetchy dockerize pythonممکن است از شما سیستم عامل هدف و نام کد آن پرسیده شود زیرا fetchy در حال حاضر فقط از بستههای مبتنی بر Debian и Ubuntu.
حالا میتوانید انتخاب کنید که کدام وابستگیها کاملاً غیرضروری هستند (در زمینه ما) و آنها را حذف کنید. برای مثال، پایتون به پرل وابسته است، اگرچه بدون نصب پرل هم کاملاً کار میکند.
یافته ها
تصویر پایتون با استفاده از دستور ایجاد شده است fetchy dockerize python3.5 وزن آن فقط ۳۵ مگابایت است (مطمئنم که در آینده میتوان آن را حتی سبکتر هم کرد). بنابراین، ما موفق شدیم ۱۵ مگابایت دیگر از حجم ایمیج بدون نیاز به دیسترول کم کنیم.
میتوانید تمام تصاویری که تاکنون جمعآوری شدهاند را مشاهده کنید. .
پروژه - .
اگر ویژگیهایی را کم دارید، فقط یک درخواست ایجاد کنید - خوشحال میشوم کمکتان کنم :) علاوه بر این، در حال حاضر روی ادغام سایر ابزارهای مدیریت بسته در fetchy کار میکنم تا نیازی به ساختهای چند مرحلهای نباشد.
منبع: www.habr.com
