Өзіне сенетін кішкентай Docker суреттері*

[американдық балалар ертегісі «The Little Engine That Could» - шамамен. жолақ]*

Өзіне сенетін кішкентай Docker суреттері*

Сіздің қажеттіліктеріңіз үшін кішкентай Docker кескіндерін автоматты түрде қалай жасауға болады

Ерекше обсессия

Соңғы екі ай бойы мені Docker кескіні қаншалықты кішкентай және әлі де жұмыс істеп тұрғаны туралы ойладым.

Түсінемін, идея біртүрлі.

Мен егжей-тегжейлі және техникалық сипаттамаларға кіріспес бұрын, бұл мәселе мені неге сонша мазалағанын және оның сізге қалай қатысты екенін түсіндіргім келеді.

Неліктен өлшем маңызды

Docker кескінінің мазмұнын азайту арқылы біз осалдықтардың тізімін азайтамыз. Оған қоса, біз кескіндерді тазарақ етеміз, өйткені оларда қолданбаларды іске қосу үшін қажет нәрсе ғана бар.

Тағы бір кішігірім артықшылығы бар - суреттер сәл жылдамырақ жүктеледі, бірақ, менің ойымша, бұл соншалықты маңызды емес.

Назар аударыңыз: Егер сіз өлшемге алаңдасаңыз, Альпі сыртқы түрі кішкентай және сізге сәйкес келуі мүмкін.

Дистролсыз кескіндер

Project Distroless негізгі «дистролсыз» кескіндердің таңдауын ұсынады, оларда пакет менеджерлері, қабықшалар және пәрмен жолында көруге үйренген басқа утилиталар жоқ. Нәтижесінде пакет менеджерлерін пайдаланыңыз pip и apt болмайды:

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

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 үшін бар.

Кішкентай суреттер

Кішкентай бейнелерді жасауға деген құмарлығыма оралу.

Жалпы, мен дистросыз бейнелердің қалай салынғанын көргім келді. Дистролсыз жоба Google құрастыру құралын пайдаланады bazel. Дегенмен, Bazel орнату және өз бейнелеріңізді жазу көп жұмысты қажет етті (шынымды айтсам, дөңгелекті қайта ойлап табу қызықты және білім беру). Мен кішірек кескіндерді жасауды жеңілдеткім келді: кескін жасау әрекеті өте қарапайым болуы керек, банальды. Сіз үшін конфигурация файлдары жоқ, консольде бір жол ғана: просто собрать образ для <приложение>.

Сонымен, егер сіз өзіңіздің кескіндеріңізді жасағыңыз келсе, біліңіз: мұндай бірегей докер кескіні бар, scratch. Scratch - бұл «бос» кескін, оның салмағы әдепкі бойынша болса да, онда файлдар жоқ - уау! - 77 байт.

FROM scratch

Суретті сызу

Скретч кескіннің идеясы мынада: кез келген тәуелділіктерді хост машинасынан көшіруге және оларды Dockerfile ішінде пайдалануға болады (бұл оларды көшіру сияқты apt және нөлден орнатыңыз) немесе кейінірек Docker кескіні жасалғанда. Бұл Docker контейнерінің мазмұнын толығымен басқаруға және осылайша кескіннің өлшемін толығымен басқаруға мүмкіндік береді.

Енді бізге осы тәуелділіктерді қандай да бір жолмен жинау керек. сияқты қолданыстағы құралдар apt пакеттерді жүктеп алуға мүмкіндік береді, бірақ олар ағымдағы құрылғыға байланысты және Windows немесе MacOS жүйесін қолдамайды.

Сондықтан мен ең кіші өлшемдегі негізгі кескінді автоматты түрде жасайтын және кез келген қолданбаны іске қосатын өз құралымды құруға кірістім. Мен Ubuntu/Debian пакеттерін қолдандым, таңдау жасадым (репозитарийлерден пакеттерді тікелей алу) және олардың тәуелділіктерін рекурсивті түрде таптым. Бағдарлама қауіпсіздік тәуекелдерін барынша азайта отырып, пакеттің соңғы тұрақты нұсқасын автоматты түрде жүктеп алуы керек еді.

Мен құралды атадым fetchy, өйткені ол... тауып алып келеді... қажет [ағылшын тілінен «алу», «әкелу» - шамамен. жолақ]. Құрал пәрмен жолы интерфейсі арқылы жұмыс істейді, бірақ сонымен бірге API ұсынады.

көмегімен кескінді құрастыру fetchy (бұл жолы Python суретін алайық), сізге тек CLI-ді келесідей пайдалану керек: fetchy dockerize python. Сізден мақсатты операциялық жүйе мен код атауы сұралуы мүмкін, себебі fetchy қазіргі уақытта тек Debian және Ubuntu негізіндегі пакеттерді пайдаланады.

Енді сіз қандай тәуелділіктерді мүлде қажет етпейтінін таңдай аласыз (біздің контексте) және оларды алып тастай аласыз. Мысалы, Python перлге тәуелді, бірақ ол Perl орнатылмай жақсы жұмыс істейді.

нәтижелері

Пәрмен арқылы жасалған Python кескіні fetchy dockerize python3.5 салмағы небәрі 35 МБ (болашақта оны одан да жеңілдетуге болатынына сенімдімін). Біз дистросыз кескіннен тағы 15 Вт-ны қырып алдық.

Сіз осы уақытқа дейін жиналған барлық суреттерді көре аласыз осында.

Жоба - осында.

Егер сізде мүмкіндіктер жетіспейтін болса, жай ғана сұрау жасаңыз - мен көмектесуге қуаныштымын :) Одан да көп сатылы құрастырудың қажеті болмас үшін, мен қазір басқа пакет менеджерлерін алу үшін біріктіру үстіндемін.

Ақпарат көзі: www.habr.com

пікір қалдыру