Imagini Docker minuscule care au crezut în sine*

[referire la basmul american pentru copii „The Little Engine That Could” – cca. BANDĂ]*

Imagini Docker minuscule care au crezut în sine*

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

Proiectul Distroless oferă o selecție de imagini de bază „fără distribuție”, acestea nu conțin manageri de pachete, shell-uri și alte utilitare pe care sunteți obișnuit să le vedeți pe linia de comandă. Ca rezultat, utilizați manageri de pachete precum 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 aici.

Proiect - aici.

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

Adauga un comentariu