[hÀnvisning till den amerikanska barnsagan "The Little Engine That Could" - ca. körfÀlt]*

Hur man automatiskt skapar smÄ Docker-bilder för dina behov
Ovanlig besatthet
Under de senaste mÄnaderna har jag varit besatt av hur liten en Docker-bild kan vara och fortfarande ha applikationen igÄng?
Jag förstÄr, tanken Àr konstig.
Innan jag gÄr in pÄ detaljerna och de tekniska detaljerna skulle jag vilja förklara varför det hÀr problemet störde mig sÄ mycket och hur det berör dig.
Varför storlek spelar roll
Genom att minska innehÄllet i Docker-bilden minskar vi dÀrmed listan över sÄrbarheter. Dessutom gör vi bilderna renare, eftersom de bara innehÄller det som behövs för att köra applikationer.
Det finns ytterligare en liten fördel - bilder laddas ner lite snabbare, men enligt min mening Àr detta inte sÄ viktigt.
Observera: Om du Àr orolig för storleken Àr sjÀlva alpina utseendet smÄ och kommer troligen att passa dig.
Otroliga bilder
erbjuder ett urval av grundlÀggande "distroless" bilder, de innehÄller inte pakethanterare, skal och andra verktyg som du Àr van vid att se pÄ kommandoraden. Som ett resultat, anvÀnd pakethanterare som pip О apt kommer inte att fungera:
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfil med Python 3 distroless bild
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 foundPip finns inte i bilden
Vanligtvis löses det hÀr problemet med en flerstegsbyggnad:
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 flera steg
Resultatet Àr en bild pÄ 130 MB. Inte sÄ dÄligt! Som jÀmförelse: standard Python-bilden vÀger 929MB, och den "tunnare" (3,7-slim) - 179 MB, alpin bild (3,7-alpine) Àr 98,6 MB, medan den distrolösa basbilden som anvÀnds i exemplet Àr 50,9 MB.
Det Ă€r rĂ€ttvist att pĂ„peka att i det föregĂ„ende exemplet kopierar vi en hel katalog /usr/local/lib/python3.7/site-packages, som kan innehĂ„lla beroenden som vi inte behöver. Ăven om det Ă€r tydligt att storleksskillnaden för alla befintliga Python-basbilder varierar.
I skrivande stund har Google distroless inte stöd för mÄnga bilder: Java och Python Àr fortfarande pÄ experimentstadiet, och Python finns bara för 2,7 och 3,5.
SmÄ bilder
Tillbaka till min besatthet av att skapa smÄ bilder.
Generellt ville jag se hur distroless bilder Ă€r uppbyggda. Det distroless-projektet anvĂ€nder Googles byggverktyg bazel. Men att installera Bazel och skriva dina egna bilder tog en hel del arbete (och för att vara helt Ă€rlig, att Ă„teruppfinna hjulet Ă€r roligt och lĂ€rorikt). Jag ville förenkla skapandet av mindre bilder: handlingen att skapa en bild ska vara extremt enkel, banal. SĂ„ att det inte finns nĂ„gra konfigurationsfiler för dig, bara en rad i konsolen: ĐżŃĐŸŃŃĐŸ ŃĐŸĐ±ŃаŃŃ ĐŸĐ±Ńаз ĐŽĐ»Ń <ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”>.
SÄ om du vill skapa dina egna bilder, vet du: det finns en sÄ unik docker-bild, scratch. Scratch Àr en "tom" bild, det finns inga filer i den, Àven om den vÀger som standard - wow! - 77 byte.
FROM scratchSkrapa bilden
Tanken med en skrapbild Àr att du kan kopiera alla beroenden frÄn vÀrddatorn till den och antingen anvÀnda dem inuti en Dockerfil (detta Àr som att kopiera dem till apt och installera frÄn början), eller senare nÀr Docker-bilden materialiseras. Detta gör att du kan kontrollera innehÄllet i Docker-behÄllaren helt och hÄllet och dÀrmed helt kontrollera storleken pÄ bilden.
Nu mÄste vi pÄ nÄgot sÀtt samla in dessa beroenden. Befintliga verktyg som apt lÄter dig ladda ner paket, men de Àr knutna till den aktuella maskinen och stöder i slutÀndan inte Windows eller MacOS.
SÄ jag bestÀmde mig för att bygga mitt eget verktyg som automatiskt skulle bygga en basavbildning av minsta möjliga storlek och fÄ det att köra vilket program som helst. Jag anvÀnde paket. Ubuntu/Debian, utförde ett urval (hÀmtade paket direkt frÄn arkiv) och hittade rekursivt deras beroenden. Programmet skulle automatiskt ladda ner den senaste stabila versionen av paketet, vilket minimerade sÀkerhetsriskerna.
Jag döpte verktyget fetchy, för han... hittar och tar med sig... det som behövs [frÄn engelska "hÀmta", "ta med" - ca. körfÀlt]. Verktyget fungerar via ett kommandoradsgrÀnssnitt, men erbjuder samtidigt ett API.
För att sÀtta ihop en bild med hjÀlp av fetchy (lÄt oss ta en Python-bild den hÀr gÄngen), du behöver bara anvÀnda CLI sÄ hÀr: fetchy dockerize python. Du kan bli ombedd att ange mÄloperativsystemet och kodnamnet pga fetchy anvÀnder för nÀrvarande endast paket baserade pÄ Debian О Ubuntu.
Nu kan du vÀlja vilka beroenden som inte alls behövs (i vÄrt sammanhang) och utesluta dem. Till exempel beror Python pÄ perl, Àven om det fungerar bra utan att Perl Àr installerat.
Resultat
Python-bild skapad med kommandot fetchy dockerize python3.5 vÀger bara 35MB (jag Àr mer Àn sÀker pÄ att den i framtiden kan göras Ànnu lÀttare). Det visar sig att vi lyckades raka bort ytterligare 15 WW frÄn den distrolösa bilden.
Du kan se alla bilder som samlats in hittills .
Projekt - .
Om du saknar funktioner, skapa bara en förfrĂ„gan - jag hjĂ€lper gĂ€rna till :) Ănnu mer, jag arbetar just nu med att integrera andra pakethanterare i fetchy, sĂ„ att det inte finns nĂ„got behov av flerstegsbyggnationer.
KĂ€lla: will.com
