O'ziga ishongan kichik Docker rasmlari*

["Bo'lishi mumkin bo'lgan kichik dvigatel" Amerika bolalar ertakiga havola - taxminan. qator]*

O'ziga ishongan kichik Docker rasmlari*

Ehtiyojlaringiz uchun avtomatik ravishda kichik Docker tasvirlarini qanday yaratish mumkin

G'ayrioddiy obsesyon

So'nggi bir necha oy davomida men Docker tasviri qanchalik kichik bo'lishi va hali ham dastur ishlayotganligi haqida o'yladim.

Tushundim, fikr g'alati.

Tafsilotlar va texnik jihatlarga kirishdan oldin, men nima uchun bu muammo meni shunchalik bezovta qilganini va bu sizga qanday ta'sir qilishini tushuntirmoqchiman.

Nima uchun o'lcham muhim

Docker tasvirining mazmunini qisqartirish orqali biz zaifliklar ro'yxatini kamaytiramiz. Bundan tashqari, biz tasvirlarni yanada toza qilamiz, chunki ular faqat ilovalarni ishga tushirish uchun zarur bo'lgan narsalarni o'z ichiga oladi.

Yana bir kichik afzallik bor - tasvirlar biroz tezroq yuklab olinadi, lekin menimcha, bu unchalik muhim emas.

E'tibor bering: Agar siz o'lcham haqida qayg'urayotgan bo'lsangiz, Alp tog'larining o'zi kichik va sizga mos kelishi mumkin.

Distrosiz tasvirlar

Distroless loyihasi asosiy "distroless" tasvirlar tanlovini taklif qiladi, ularda paket menejerlari, qobiqlar va buyruq satrida ko'rishga odatlangan boshqa yordamchi dasturlar mavjud emas. Natijada, kabi paket menejerlaridan foydalaning pip и apt ishlamaydi:

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

Python 3 distroless tasviridan foydalangan holda 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

Pip rasmda yo'q

Odatda bu muammo ko'p bosqichli qurilish orqali hal qilinadi:

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/

Ko'p bosqichli yig'ish

Natijada 130 MB hajmdagi rasm paydo bo'ladi. Juda yomon emas! Taqqoslash uchun: standart Python tasvirining og'irligi 929 MB, "ingichkaroq" (3,7-slim) - 179MB, alp tasviri (3,7-alpine) 98,6 MB, misolda ishlatiladigan asosiy distrosiz tasvir esa 50,9 MB.

Shuni ta'kidlash joizki, oldingi misolda biz butun katalogdan nusxa ko'chirmoqdamiz /usr/local/lib/python3.7/site-packages, unda bizga kerak bo'lmagan bog'liqliklar bo'lishi mumkin. Mavjud barcha Python asosiy tasvirlarining o'lchamdagi farqi farq qilishi aniq bo'lsa-da.

Yozish paytida Google distroless ko'plab tasvirlarni qo'llab-quvvatlamaydi: Java va Python hali tajriba bosqichida va Python faqat 2,7 va 3,5 uchun mavjud.

Kichik tasvirlar

Kichkina tasvirlarni yaratishga bo'lgan qiziqishimga qayting.

Umuman olganda, men distrosiz tasvirlar qanday yaratilganligini ko'rmoqchi edim. Distrosiz loyiha Googlening qurish vositasidan foydalanadi bazel. Biroq, Bazelni o'rnatish va o'z rasmlaringizni yozish juda ko'p mehnat talab qildi (va rostini aytsam, g'ildirakni qayta ixtiro qilish qiziqarli va ma'rifiy). Men kichikroq tasvirlarni yaratishni soddalashtirmoqchi edim: tasvirni yaratish harakati juda oddiy bo'lishi kerak, banal. Shunday qilib, siz uchun konfiguratsiya fayllari yo'q, faqat konsolda bitta qator: просто собрать образ для <приложение>.

Shunday qilib, agar siz o'zingizning rasmingizni yaratmoqchi bo'lsangiz, biling: shunday noyob docker tasviri bor, scratch. Scratch - bu "bo'sh" rasm, unda hech qanday fayl yo'q, garchi u sukut bo'yicha og'irlikda bo'lsa - voy! - 77 bayt.

FROM scratch

Chizilgan rasm

Skretch tasvirining g'oyasi shundan iboratki, siz har qanday bog'liqlikni xost mashinasidan unga nusxalashingiz va ularni Dockerfile ichida ishlatishingiz mumkin (bu ularni nusxalash kabidir) apt va noldan o'rnating) yoki keyinroq Docker tasviri amalga oshirilganda. Bu sizga Docker konteynerining tarkibini to'liq nazorat qilish imkonini beradi va shu bilan tasvir hajmini to'liq nazorat qiladi.

Endi biz qandaydir tarzda bu bog'liqliklarni yig'ishimiz kerak. Mavjud vositalar kabi apt paketlarni yuklab olish imkonini beradi, lekin ular joriy mashinaga bog'langan va Windows yoki MacOS-ni qo'llab-quvvatlamaydi.

Shunday qilib, men avtomatik ravishda eng kichik o'lchamdagi asosiy tasvirni yaratadigan va har qanday dasturni ishga tushiradigan o'z vositamni yaratishga kirishdim. Men Ubuntu/Debian paketlaridan foydalandim, tanlov qildim (to'g'ridan-to'g'ri omborlardan paketlarni olish) va ularning bog'liqliklarini rekursiv ravishda topdim. Dastur paketning eng so'nggi barqaror versiyasini avtomatik ravishda yuklab olishi, xavfsizlik xavfini imkon qadar kamaytirishi kerak edi.

Men vositani nomladim fetchy, chunki u... topadi va olib keladi... kerakli narsani [ingliz tilidan "olish", "olib kelish" - taxminan. qator]. Asbob buyruq qatori interfeysi orqali ishlaydi, lekin ayni paytda API taklif qiladi.

yordamida tasvirni yig'ish uchun fetchy (Keling, bu safar Python tasvirini olaylik), siz shunchaki CLI dan foydalanishingiz kerak: fetchy dockerize python. Sizdan maqsadli operatsion tizim va kod nomi so'ralishi mumkin, chunki fetchy hozirda faqat Debian va Ubuntu asosidagi paketlardan foydalaniladi.

Endi siz qaysi bog'liqliklar umuman kerak emasligini tanlashingiz mumkin (bizning kontekstimizda) va ularni chiqarib tashlashingiz mumkin. Misol uchun, Python Perl-ga bog'liq, garchi u Perl o'rnatilmasa ham yaxshi ishlaydi.

Natijalar

Buyruq yordamida yaratilgan Python tasviri fetchy dockerize python3.5 atigi 35 MB og'irlikda (kelajakda uni yanada engilroq qilish mumkinligiga ishonchim komil). Ma'lum bo'lishicha, biz distrosiz tasvirdan yana 15 Vt quvvatni olib tashlashga muvaffaq bo'ldik.

Siz hozirgacha to'plangan barcha rasmlarni ko'rishingiz mumkin shu yerda.

Loyiha - shu yerda.

Agar sizda funksiyalar etishmayotgan bo‘lsa, shunchaki so‘rov yarating – men yordam berishdan xursand bo‘laman :) Bundan tashqari, men hozirda ko‘p bosqichli tuzilmalarga ehtiyoj qolmasligi uchun boshqa paket menejerlarini fetchy ichiga integratsiyalash ustida ishlayapman.

Manba: www.habr.com

a Izoh qo'shish