["Bo'lishi mumkin bo'lgan kichik dvigatel" Amerika bolalar ertakiga havola - taxminan. qator]*
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
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
Loyiha -
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