Cum să creați automat imagini Docker mici pentru nevoile dvs
Obsesie neobișnuită
În ultimele două luni, am fost obsedat de cât de mică poate fi o imagine Docker și încă mai am aplicația în funcțiune?
Am inteles, ideea este ciudata.
Înainte de a intra în detalii și aspecte tehnice, aș dori să explic de ce m-a deranjat atât de mult această problemă și cum vă privește.
De ce contează dimensiunea
Prin reducerea conținutului imaginii Docker, reducem astfel lista de vulnerabilități. În plus, facem imaginile mai curate, deoarece conțin doar ceea ce este necesar pentru rularea aplicațiilor.
Mai există un mic avantaj - imaginile sunt descărcate puțin mai repede, dar, în opinia mea, acest lucru nu este atât de important.
Vă rugăm să rețineți: dacă sunteți îngrijorat de mărime, Alpine arată în sine mic și vă va potrivi cu siguranță.
Imagini fără difuzare
pip
и apt
nu va funcționa:
FROM gcr.io/distroless/python3
RUN pip3 install numpy
Dockerfile utilizând imaginea fără distribuție 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
Pip nu este în imagine
De obicei, această problemă este rezolvată printr-o construcție în mai multe etape:
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/
Asamblare în mai multe etape
Rezultatul este o imagine de 130 MB. Nu prea rau! Pentru comparație: imaginea implicită Python cântărește 929 MB, iar cea „mai subțire” (3,7-slim
) - 179 MB, imagine alpină (3,7-alpine
) este de 98,6 MB, în timp ce imaginea de bază fără distribuție folosită în exemplu este de 50,9 MB.
Este corect să subliniem că în exemplul anterior copiem un întreg director /usr/local/lib/python3.7/site-packages
, care poate conține dependențe de care nu avem nevoie. Deși este clar că diferența de dimensiune a tuturor imaginilor de bază Python existente variază.
La momentul scrierii, Google distroless nu acceptă multe imagini: Java și Python sunt încă în stadiu experimental, iar Python există doar pentru 2,7 și 3,5.
Imagini minuscule
Revenind la obsesia mea de a crea imagini mici.
În general, am vrut să văd cum sunt construite imaginile distroless. Proiectul distroless folosește instrumentul de compilare Google bazel
. Cu toate acestea, instalarea lui Bazel și scrierea propriilor imagini a luat multă muncă (și să fiu complet sincer, reinventarea roții este distractivă și educativă). Am vrut să simplific crearea de imagini mai mici: actul de a crea o imagine ar trebui să fie extrem de simplu, banal. Pentru ca să nu existe fișiere de configurare pentru tine, doar o linie în consolă: просто собрать образ для <приложение>
.
Deci, dacă doriți să vă creați propriile imagini, atunci știți: există o astfel de imagine docker unică, scratch
. Scratch este o imagine „goală”, nu există fișiere în ea, deși cântărește implicit - wow! - 77 de octeți.
FROM scratch
Scratch imagine
Ideea unei imagini răzuitoare este că puteți copia orice dependențe de pe mașina gazdă în ea și fie să le folosiți în interiorul unui fișier Docker (acesta este ca și cum le-ați copia în apt
și instalați de la zero), sau mai târziu când imaginea Docker este materializată. Acest lucru vă permite să controlați complet conținutul containerului Docker și, astfel, să controlați complet dimensiunea imaginii.
Acum trebuie să colectăm cumva aceste dependențe. Instrumente existente cum ar fi apt
vă permit să descărcați pachete, dar acestea sunt legate de mașina actuală și, la urma urmei, nu acceptă Windows sau MacOS.
Așa că mi-am propus să-mi construiesc propriul instrument care să construiască automat o imagine de bază de cea mai mică dimensiune posibilă și, de asemenea, să ruleze orice aplicație. Am folosit pachete Ubuntu/Debian, am făcut o selecție (obținând pachete direct din depozite) și am găsit recursiv dependențele acestora. Programul trebuia să descarce automat cea mai recentă versiune stabilă a pachetului, minimizând pe cât posibil riscurile de securitate.
Am numit instrumentul fetchy
, pentru că el... găsește și aduce... ceea ce este nevoie [din engleza „aduceți”, „aduceți” - aprox. BANDĂ]. Instrumentul funcționează printr-o interfață de linie de comandă, dar în același timp oferă un API.
Pentru a asambla o imagine folosind fetchy
(să luăm o imagine Python de data aceasta), trebuie doar să utilizați CLI-ul astfel: fetchy dockerize python
. Vi se poate cere sistemul de operare țintă și numele de cod deoarece fetchy
Momentan folosește numai pachete bazate pe Debian și Ubuntu.
Acum puteți alege care dependențe nu sunt deloc necesare (în contextul nostru) și să le excludeți. De exemplu, Python depinde de perl, deși funcționează bine fără Perl instalat.
Constatări
Imagine Python creată folosind comanda fetchy dockerize python3.5
cântărește doar 35MB (sunt mai mult decât sigur că pe viitor poate fi făcut și mai ușor). Se pare că am reușit să tuns încă 15 WW din imaginea distroless.
Puteti vedea toate imaginile colectate pana acum
Proiect -
Dacă vă lipsesc funcții, creați doar o solicitare - voi fi bucuros să vă ajut :) Chiar mai mult, în prezent lucrez la integrarea altor manageri de pachete în fetchy, astfel încât să nu fie nevoie de versiuni în mai multe etape.
Sursa: www.habr.com