Små Docker-billeder, der troede på sig selv*

[henvisning til det amerikanske børneeventyr "The Little Engine That Could" - ca. bane]*

Små Docker-billeder, der troede på sig selv*

Sådan opretter du automatisk små Docker-billeder til dine behov

Usædvanlig besættelse

I de sidste par måneder har jeg været besat af, hvor lille et Docker-billede kan være og stadig have applikationen kørende?

Jeg forstår, ideen er mærkelig.

Før jeg kommer ind på detaljerne og de tekniske detaljer, vil jeg gerne forklare, hvorfor dette problem generede mig så meget, og hvordan det bekymrer dig.

Hvorfor størrelse betyder noget

Ved at reducere indholdet af Docker-billedet reducerer vi derved listen over sårbarheder. Derudover gør vi billederne renere, fordi de kun indeholder det, der er nødvendigt for at køre applikationer.

Der er endnu en lille fordel - billeder downloades lidt hurtigere, men efter min mening er dette ikke så vigtigt.

Bemærk venligst: Hvis du er bekymret for størrelsen, er selve alpine looks små og vil sandsynligvis passe dig.

Distroløse billeder

Projekt Distroless tilbyder et udvalg af grundlæggende "distroløse" billeder, de indeholder ikke pakkeadministratorer, skaller og andre hjælpeprogrammer, som du er vant til at se på kommandolinjen. Som et resultat skal du bruge pakkeadministratorer som pip и apt vil ikke virke:

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

Dockerfil ved hjælp af Python 3 distroless billede

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 er ikke på billedet

Normalt løses dette problem ved en multi-stage build:

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/

Montering i flere trin

Resultatet er et billede på 130MB i størrelse. Ikke dårligt! Til sammenligning: Standard Python-billedet vejer 929 MB, og det "tyndere" (3,7-slim) - 179 MB, alpine billede (3,7-alpine) er 98,6 MB, mens det grundlæggende distroløse billede, der bruges i eksemplet, er 50,9 MB.

Det er rimeligt at påpege, at i det foregående eksempel kopierer vi en hel mappe /usr/local/lib/python3.7/site-packages, som kan indeholde afhængigheder, som vi ikke har brug for. Selvom det er klart, at størrelsesforskellen på alle eksisterende Python-basebilleder varierer.

I skrivende stund understøtter Google distroless ikke mange billeder: Java og Python er stadig på forsøgsstadiet, og Python findes kun til 2,7 og 3,5.

Små billeder

Tilbage til min besættelse af at skabe små billeder.

Generelt ville jeg se, hvordan distroløse billeder er opbygget. Det distroløse projekt bruger Googles byggeværktøj bazel. Det tog dog meget arbejde at installere Bazel og skrive dine egne billeder (og for at være helt ærlig er det sjovt og lærerigt at genopfinde hjulet). Jeg ønskede at forenkle skabelsen af ​​mindre billeder: handlingen med at skabe et billede skulle være ekstremt enkel, banal. Så der er ingen konfigurationsfiler til dig, kun en linje i konsollen: просто собрать образ для <приложение>.

Så hvis du vil lave dine egne billeder, så ved: der er sådan et unikt docker-billede, scratch. Scratch er et "tomt" billede, der er ingen filer i det, selvom det vejer som standard - wow! - 77 bytes.

FROM scratch

Ridse billede

Ideen med et ridsebillede er, at du kan kopiere alle afhængigheder fra værtsmaskinen ind i det og enten bruge dem inde i en Dockerfile (dette er som at kopiere dem til apt og installere fra bunden), eller senere, når Docker-billedet er materialiseret. Dette giver dig mulighed for fuldstændigt at kontrollere indholdet af Docker-beholderen og dermed fuldstændigt kontrollere størrelsen af ​​billedet.

Nu skal vi på en eller anden måde samle disse afhængigheder. Eksisterende værktøjer som apt giver dig mulighed for at downloade pakker, men de er bundet til den aktuelle maskine og understøtter trods alt ikke Windows eller MacOS.

Så jeg satte mig for at bygge mit eget værktøj, der automatisk ville bygge et basisbillede af den mindst mulige størrelse og også køre enhver applikation. Jeg brugte Ubuntu/Debian-pakker, foretog et valg (henter pakker direkte fra arkiverne) og fandt rekursivt deres afhængigheder. Programmet skulle automatisk downloade den seneste stabile version af pakken, hvilket minimerer sikkerhedsrisici så meget som muligt.

Jeg navngav værktøjet fetchy, fordi han... finder og bringer... hvad der skal til [fra engelsk "hente", "bringe" - ca. bane]. Værktøjet fungerer via en kommandolinjegrænseflade, men tilbyder samtidig en API.

For at samle et billede vha fetchy (lad os tage et Python-billede denne gang), du skal bare bruge CLI sådan her: fetchy dockerize python. Du bliver muligvis bedt om måloperativsystemet og kodenavnet pga fetchy bruger i øjeblikket kun pakker baseret på Debian og Ubuntu.

Nu kan du vælge hvilke afhængigheder der slet ikke er nødvendige (i vores sammenhæng) og udelukke dem. For eksempel afhænger Python af perl, selvom det fungerer fint uden Perl installeret.

Fund

Python-billede oprettet ved hjælp af kommandoen fetchy dockerize python3.5 vejer kun 35MB (jeg er mere end sikker på, at den i fremtiden kan gøres endnu lettere). Det viser sig, at det lykkedes os at barbere yderligere 15 WW fra det distroløse billede.

Du kan se alle de indsamlede billeder indtil videre her.

Projekt - her.

Hvis du mangler funktioner, skal du bare oprette en forespørgsel - jeg hjælper gerne :) Endnu mere arbejder jeg i øjeblikket på at integrere andre pakkeadministratorer i fetchy, så der ikke er behov for multi-stage builds.

Kilde: www.habr.com

Tilføj en kommentar