SmÄ Docker-bilder som trodde pÄ sig sjÀlva*

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

SmÄ Docker-bilder som trodde pÄ sig sjÀlva*

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

Projekt Distroless 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 numpy

Dockerfil 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 found

Pip 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 scratch

Skrapa 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 hÀr.

Projekt - hÀr.

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

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster