[henvisning til den amerikanske bĂžrnefortĂŠlling "Den lille lokomotiv, der kunne" â overs.]*

Hvordan man automatisk skaber smÄ docker-billeder til sine behov
UsĂŠdvanlig besĂŠttelse
De sidste par mÄneder har jeg vÊret besat af en tankegang: hvor meget kan man reducere et Docker-billede, sÄ applikationen stadig fungerer?
Jeg forstÄr, at ideen er underlig.
FÞr vi dykker ind i detaljerne og tekniske omrÄder, vil jeg gerne forklare, hvorfor dette problem fangede mig sÄ meget, og hvordan det vedrÞrer dig.
Hvorfor stĂžrrelse betyder noget
Ved at reducere indholdet af Docker-billedet reducerer vi samtidig listen over sÄrbarheder. Derudover gÞr vi billederne renere, da de kun indeholder det, der er nÞdvendigt for at kÞre applikationer.
Der er ogsĂ„ en lille fordel â billederne downloades lidt hurtigere, men for mig er det ikke sĂ„ vigtigt.
BemÊrk: Hvis du er bekymret for stÞrrelsen, er Alpine-billederne selv smÄ og sikkert vil vÊre velegnede til dig.
Distroless-billeder
tilbyder en samling af grundlĂŠggende "distroless"-billeder, som ikke indeholder pakkestyringssystemer, skaller og andre vĂŠrktĂžjer, som du er vant til at se i kommandolinjen. Derfor kan man ikke bruge pakkestyringssystemer som pip og apt ikke kan anvendes:
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfile, der bruger distroless-billede Python 3
Sender byggekontext til Docker-daemon 2.048kB
Trin 1/2 : FROM gcr.io/distroless/python3
---> 556d570d5c53
Trin 2/2 : RUN pip3 install numpy
---> KĂžrer i dbfe5623f125
/bin/sh: 1: pip3: ikke fundetPip er ikke til stede i billedet
Normalt lÞses et sÄdant problem ved hjÊlp af multi-trin byggeri:
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/Multi-trins byggeri
Resultatet er et billede pĂ„ 130MB. Ikke sĂ„ dĂ„rligt! Til sammenligning vejer standard Python-billedet 929MB, og det "slankede" (3,7-slim) â 179MB, Alpine-billedet (3,7-alpine) â 98,6MB, mens det basis distroless-billede, der blev brugt i eksemplet, er 50,9MB.
Man kan med rette pÄpege, at i det tidligere eksempel kopierer vi et helt katalog /usr/local/lib/python3.7/site-packages, som kan indeholde unÞdvendige afhÊngigheder for os. Selvom det er klart, at stÞrrelsesforskellene mellem alle eksisterende basisbilleder for Python varierer.
PĂ„ tidspunktet for skrivningen understĂžtter Google distroless ikke sĂ„ mange billeder: Java og Python â stadig i eksperimentelle stadier, og Python eksisterer kun for 2,7 og 3,5.
SmÄ billeder
Lad os vende tilbage til min besÊttelse af at lave smÄ billeder.
Generelt ville jeg se, hvordan distroless-billeder er opbygget. Distroless-projektet bruger Googles build-vĂŠrktĂžj bazel. Men for at installere Bazel og skrive mine egne billeder mĂ„tte jeg arbejde hĂ„rdt (og for at vĂŠre helt ĂŠrlig, opfinde hjulet igen â det er sjovt og lĂŠrerigt). Jeg Ăžnskede at forenkle oprettelsen af reducerede billeder: handlingen ved at oprette et billede skal vĂŠre sĂ„ simpel som muligt, banal. SĂ„ der skal ikke vĂŠre nogen konfigurationsfiler, kun Ă©n linje i konsollen: bare byg et billede for <applikation>.
SĂ„, hvis du Ăžnsker at oprette dine egne billeder, sĂ„ ved: der findes et unikt docker-billede, scratch. Scratch er et "tomt" billede, der ikke indeholder filer, selvom det vejer som standard â wow! â 77 byte.
FROM scratchScratch-billedet
Idéen med scratch-billedet er, at man kan kopiere enhver afhÊngighed fra vÊrtsmaskinen ind i det og enten bruge dem i Dockerfile (det er ligesom at kopiere dem ind i apt og installere fra bunden), eller senere, nÄr Docker-billedet er materialiseret. Dette giver fuld kontrol over indholdet af Docker-containeren, og dermed ogsÄ over billedets stÞrrelse.
Og nu skal vi finde en mÄde at samle disse afhÊngigheder pÄ. Eksisterende vÊrktÞjer som apt giver mulighed for at downloade pakker, men de er bundet til den nuvÊrende maskine og understÞtter i sidste ende ikke Windows eller MacOS.
SĂ„ jeg satte mig for at opbygge mit eget vĂŠrktĂžj, som automatisk ville samle et grundlĂŠggende billede af den mindst mulige stĂžrrelse og stadig kunne kĂžre enhver applikation. Jeg brugte pakker fra Ubuntu/Debian, udarbejdede en liste (hentede pakker lige fra repositorier) og fandt deres afhĂŠngigheder rekursivt. Programmet skulle automatisk downloade den nyeste stabile version af pakken for at minimere sikkerhedsrisici.
Jeg kaldte vĂŠrktĂžjet fetchy, fordi det⊠finder og bringer⊠hvad der er nĂždvendigt [fra engelsk "fetch", "at bringe" â overs. anm.]. VĂŠrktĂžjet fungerer gennem kommandolinjeinterfacet, men tilbyder samtidig ogsĂ„ en API.
For at kunne samle et billede ved hjÊlp af fetchy (denne gang tager vi Python-billedet), skal du blot bruge CLI som dette: fetchy dockerize python. Du kan blive bedt om at angive det mÄlrettede operativsystem og kodenavn, da fetchy indtil videre kun bruger Debian- og Ubuntu-baserede pakker.
Nu kan du vĂŠlge, hvilke afhĂŠngigheder der slet ikke er nĂždvendige (i vores kontekst), og udelukke dem. For eksempel afhĂŠnger Python af Perl, selvom det fungerer fint uden installeret Perl.
Resultater
Python-billedet, der er oprettet med kommandoen fetchy dockerize python3.5 vejer kun 35MB (jeg er mere end sikker pÄ, at det i fremtiden kan gÞres endnu lettere). Det viser sig, at vi har "skÄret" yderligere 15MB fra distroless-billedet.
Du kan se alle de indsamlede billeder indtil videre .
Projektet â .
Hvis du mangler funktioner, sĂ„ lav en anmodning â jeg vil gerne hjĂŠlpe đ Endda mere, jeg arbejder i Ăžjeblikket pĂ„ at integrere andre pakkemanagere i fetchy, sĂ„ behovet for trinvise opbygninger forsvinder.
Kilde: habr.com
