Özlərinə inanan kiçik Docker şəkilləri*

[Amerika uşaq nağılına istinad, "Ola bilən kiçik mühərrik" - təqribən. zolaq]*

Özlərinə inanan kiçik Docker şəkilləri*

Ehtiyaclarınız üçün avtomatik olaraq kiçik Docker şəkillərini necə yaratmaq olar

Qeyri-adi Obsessiya

Son bir neçə ay ərzində mən Docker şəklinin nə qədər kiçik ola biləcəyi ilə maraqlandım və tətbiq hələ də işləyir?

Başa düşürəm, fikir qəribədir.

Təfərrüatlara və texniki cəhətlərə keçməzdən əvvəl bu problemin məni niyə bu qədər narahat etdiyini və bunun sizi necə narahat etdiyini izah etmək istərdim.

Niyə ölçü vacibdir

Docker təsvirinin məzmununu azaltmaqla biz zəifliklərin siyahısını azaldırıq. Bundan əlavə, biz şəkilləri daha təmiz edirik, çünki onlar yalnız proqramları işə salmaq üçün lazım olanları ehtiva edir.

Daha bir kiçik üstünlük var - şəkillər bir az daha sürətli yüklənir, amma mənim fikrimcə, bu o qədər də vacib deyil.

Diqqət edin: Ölçüdən narahatsınızsa, Alp görünüşləri kiçikdir və çox güman ki, sizə uyğun olacaq.

Distrosiz şəkillər

Layihə Distroless əsas "distroless" şəkillərin seçimini təklif edir, onların tərkibində paket menecerləri, qabıqlar və komanda xəttində görməyə alışdığınız digər yardım proqramları yoxdur. Nəticədə, kimi paket menecerlərindən istifadə edin pip и apt işləməyəcək:

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

Python 3 distroless təsvirindən istifadə edən Dockerfile

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

Şəkildə Pip yoxdur

Adətən bu problem çox mərhələli tikinti ilə həll olunur:

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/

Çoxmərhələli montaj

Nəticə 130 MB ölçülü bir şəkildir. Çox da pis deyil! Müqayisə üçün: defolt Python şəklinin çəkisi 929 MB, "nazik" isə (3,7-slim) - 179MB, alp təsviri (3,7-alpine) 98,6 MB, nümunədə istifadə olunan əsas distroz təsvir isə 50,9 MB-dır.

Qeyd etmək düzgün olar ki, əvvəlki nümunədə biz bütün kataloqu kopyalayırıq /usr/local/lib/python3.7/site-packages, bizə lazım olmayan asılılıqları ehtiva edə bilər. Bütün mövcud Python əsas şəkillərinin ölçü fərqinin fərqli olduğu aydın olsa da.

Yazı zamanı Google distroless bir çox şəkilləri dəstəkləmir: Java və Python hələ eksperimental mərhələdədir və Python yalnız 2,7 və 3,5 üçün mövcuddur.

Kiçik şəkillər

Kiçik şəkillər yaratmaq vəsvəsəsinə qayıt.

Ümumiyyətlə, mən distroz təsvirlərin necə qurulduğunu görmək istəyirdim. Distroless layihə Google-un qurma alətindən istifadə edir bazel. Bununla belə, Bazel-i quraşdırmaq və öz şəkillərinizi yazmaq çox iş tələb etdi (və düzünü desəm, çarxı yenidən kəşf etmək əyləncəli və öyrədicidir). Daha kiçik şəkillərin yaradılmasını sadələşdirmək istədim: bir görüntü yaratmaq aktı son dərəcə sadə olmalıdır, banal. Beləliklə, sizin üçün heç bir konfiqurasiya faylı yoxdur, konsolda yalnız bir sətir: просто собрать образ для <приложение>.

Beləliklə, öz şəkillərinizi yaratmaq istəyirsinizsə, bilin: belə bir unikal docker görüntüsü var, scratch. Scratch "boş" bir şəkildir, içərisində heç bir fayl yoxdur, baxmayaraq ki, standart olaraq çəkisi var - vay! - 77 bayt.

FROM scratch

Scratch image

Sızıntı şəklinin ideyası ondan ibarətdir ki, siz host maşından istənilən asılılığı ona kopyalaya və ya onları Dockerfile daxilində istifadə edə bilərsiniz (bu, onları kopyalamaq kimidir. apt və sıfırdan quraşdırın) və ya daha sonra Docker təsviri reallaşdırıldıqda. Bu, Docker konteynerinin məzmununu tamamilə idarə etməyə və beləliklə, təsvirin ölçüsünə tam nəzarət etməyə imkan verir.

İndi bu asılılıqları bir şəkildə toplamaq lazımdır. kimi mövcud alətlər apt paketləri yükləməyə imkan verir, lakin onlar cari maşına bağlıdır və nəhayət, Windows və ya MacOS-u dəstəkləmir.

Beləliklə, mən avtomatik olaraq mümkün olan ən kiçik ölçülü əsas təsviri yarada biləcək və həmçinin istənilən proqramı işə salacaq öz alətimi yaratmağa başladım. Ubuntu/Debian paketlərindən istifadə etdim, seçim etdim (paketləri birbaşa depolardan əldə etdim) və rekursiv olaraq onların asılılıqlarını tapdım. Proqram paketin ən son stabil versiyasını avtomatik yükləməli, təhlükəsizlik risklərini mümkün qədər minimuma endirməli idi.

Aləti adlandırdım fetchy, çünki o... tapıb gətirir... lazım olanı [ingilis dilindən "gətirmək", "gətirmək" - təqribən. zolaq]. Alət komanda xətti interfeysi vasitəsilə işləyir, lakin eyni zamanda API təklif edir.

Istifadə edərək bir şəkil yığmaq üçün fetchy (gəlin bu dəfə Python şəklini çəkək), sadəcə olaraq CLI-dən belə istifadə etməlisiniz: fetchy dockerize python. Sizdən hədəf əməliyyat sistemi və kod adı tələb oluna bilər, çünki fetchy hazırda yalnız Debian və Ubuntu əsasında paketlərdən istifadə edir.

İndi siz hansı asılılıqların ümumiyyətlə lazım olmadığını seçə bilərsiniz (bizim kontekstimizdə) və onları istisna edə bilərsiniz. Məsələn, Python Perl-dən asılıdır, baxmayaraq ki, Perl quraşdırılmadan yaxşı işləyir.

Tapıntılar

Python şəkli əmrdən istifadə edərək yaradılmışdır fetchy dockerize python3.5 çəkisi cəmi 35 MB (mən əminəm ki, gələcəkdə daha da yüngülləşdirilə bilər). Belə çıxır ki, biz distroless görüntüdən daha 15 WW qırxmağı bacardıq.

İndiyə qədər toplanmış bütün şəkilləri görə bilərsiniz burada.

Layihə - burada.

Əgər funksiyalarınız çatışmırsa, sadəcə sorğu yaradın - mən məmnuniyyətlə kömək edəcəm :) Bundan əlavə, mən hazırda digər paket menecerlərini cəlbedici proqrama inteqrasiya etmək üzərində işləyirəm ki, çoxmərhələli quruluşlara ehtiyac olmasın.

Mənbə: www.habr.com

Добавить комментарий