[referens till den amerikanska barnhistorien 'Den lilla lokomotiv som kunde' ('The Little Engine That Could') â övers.]*

Hur man automatiskt skapar smÄ Docker-images för sina behov
En ovanlig besatthet
De senaste mÄnaderna har jag varit besatt av en idé: hur mycket kan man minska en Docker-image sÄ att applikationen fortfarande fungerar?
Jag förstÄr, idén Àr konstig.
Innan jag gÄr in pÄ detaljer och tekniska avvikelser vill jag förklara varför detta problem fascinerar mig sÄ mycket och hur det berör dig.
Varför storlek spelar roll
Genom att minska innehÄllet i Docker-imagen minskar vi listan över sÄrbarheter. Dessutom gör vi bilderna renare, eftersom de endast innehÄller det som behövs för att köra applikationerna.
Det finns ytterligare en liten fördel â bilderna laddas ner lite snabbare, men personligen tycker jag att det inte Ă€r sĂ„ viktigt.
Observera: Om du Àr bekymrad över storleken Àr Alpine-images smÄ i sig sjÀlva och passar sÀkerligen för dig.
Distroless-images
erbjuder en uppsÀttning grundlÀggande 'distroless'-bilder, de innehÄller inga paketchefer, skal eller andra verktyg som du Àr van vid att se i kommandoraden. Som ett resultat gÄr det inte att anvÀnda paketchefer sÄsom pip och apt inte möjligt:
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfile som anvÀnder distroless-image Python 3
Skickar byggkontext till Docker-daemon 2.048kB
Steg 1/2: FROM gcr.io/distroless/python3
---> 556d570d5c53
Steg 2/2: RUN pip3 install numpy
---> Kör i dbfe5623f125
/bin/sh: 1: pip3: hittades intePip finns inte i imagen
Vanligtvis löses detta problem genom flertrÀnad byggnad:
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/FlertrÀnad byggnad
Resultatet Ă€r en bild som vĂ€ger 130MB. Inte sĂ„ illa! JĂ€mfört med: standard Python-image vĂ€ger 929MB, och 'slimmade' (3.7-slim) â 179MB, Alpine-image (3.7-alpine) â 98.6MB, medan den grundlĂ€ggande distroless-imagen som anvĂ€nds i exemplet vĂ€ger 50.9MB.
Man kan med rĂ€tta pĂ„peka att i det föregĂ„ende exemplet kopierar vi en hel katalog /usr/local/lib/python3.7/site-packages, dĂ€r onödiga beroenden kan finnas. Ăven om det Ă€r uppenbart att storleksskillnaden mellan alla existerande grundlĂ€ggande Python-images varierar.
Vid tidpunkten för dessa rader stödjer Google distroless inte sÄ mÄnga images: Java och Python Àr fortfarande i experimentfas och Python finns endast för 2.7 och 3.5.
SmÄ bilder
LÄt oss ÄtergÄ till min besatthet av att skapa smÄ bilder.
Jag ville egentligen se hur distroless-bilder fungerar. Distroless-projektet anvĂ€nder Googles byggverktyg bazel. Men för att installera Bazel och skriva egna bilder fick jag kĂ€mpa (och om jag ska vara helt Ă€rlig, sĂ„ var det som att Ă„teruppfinna hjulet â vilket var bĂ„de roligt och lĂ€rorikt). Jag ville förenkla skapandet av nedskurna bilder: skapandet av en bild borde vara sĂ„ enkelt som möjligt, banalt. SĂ„ inga konfigurationsfiler, bara en rad i konsolen: bara skapa en bild för.
SĂ„ om du vill skapa egna bilder, sĂ„ vet att det finns en unik docker-bild, scratch. Scratch Ă€r en "tom" bild, den innehĂ„ller inga filer, Ă€ven om den vĂ€ger â oho! â 77 byte som standard.
FROM scratchScratch-bilden
Idén med scratch-bilden Àr att du kan kopiera in alla beroenden frÄn vÀrdmaskinen och antingen anvÀnda dem i Dockerfile (det Àr som att kopiera dem in i apt och installera dem frÄn grunden), eller senare, nÀr Docker-bilden har skapats. Detta gör att du har fullstÀndig kontroll över innehÄllet i Docker-behÄllaren och sÄlunda ocksÄ över bildens storlek.
Nu behöver vi pÄ nÄgot sÀtt samla dessa beroenden. Befintliga verktyg som apt tillÄter nedladdning av paket, men de Àr bundna till den aktuella maskinen och stöder inte Windows eller MacOS.
Och sÄ började jag skapa mitt eget verktyg som automatiskt skulle samla in en grundlÀggande bild av minsta möjliga storlek som fortfarande skulle kunna köra valfritt program. Jag anvÀnde Ubuntu/Debian-paket, gjorde urval (genom att hÀmta paket direkt frÄn arkiven) och hittade deras beroenden rekursivt. Programmet skulle automatiskt ladda ner den senaste stabila versionen av paketet, vilket minimerade sÀkerhetsriskerna.
Jag kallade verktyget fetchy, eftersom det... hittar och hĂ€mtar... vad som behövs [frĂ„n engelska "fetch", "hĂ€mta" â anm. övers.]. Verktyget fungerar via kommandoradsgrĂ€nssnitt, men erbjuder ocksĂ„ ett API.
För att skapa en bild med hjÀlp av fetchy (denna gÄng tar vi Python-bilden), behöver du bara anvÀnda CLI sÄ hÀr: fetchy dockerize python. Du kan bli ombedd att ange mÄlsystem och kodnamn, eftersom fetchy just nu anvÀnder bara paket baserade pÄ Debian och Ubuntu.
Nu kan du vÀlja vilka beroenden som inte alls behövs (i vÄrt sammanhang) och utesluta dem. Till exempel, Python Àr beroende av Perl, men fungerar utmÀrkt utan installerad Perl.
Resultat
Python-avbildningen som skapades med kommandot fetchy dockerize python3.5 vÀger endast 35 MB (jag Àr mer Àn sÀker pÄ att den i framtiden kan göras Ànnu lÀttare). SÄledes lyckades vi "skÀra av" ytterligare 15 MB frÄn distroless-avbildningen.
Du kan se alla avbildningar som har samlats in hittills .
Projektet â .
Om du saknar funktioner, skapa bara en begĂ€ran â jag hjĂ€lper gĂ€rna till đ Dessutom arbetar jag för nĂ€rvarande med att integrera andra paketförvaltare i fetchy, sĂ„ att behovet av flertrinsbyggen försvinner.
KĂ€lla: habr.com
