Små Docker-bilder som trodde på seg selv*

[referanse til det amerikanske barneeventyret "The Little Engine That Could" - ca. kjørefelt]*

Små Docker-bilder som trodde på seg selv*

Hvordan lage små Docker-bilder automatisk for dine behov

Uvanlig besettelse

De siste par månedene har jeg vært besatt av hvor lite et Docker-bilde kan være og fortsatt ha applikasjonen i gang?

Jeg forstår, tanken er merkelig.

Før jeg går inn på detaljene og de tekniske detaljene, vil jeg gjerne forklare hvorfor dette problemet plaget meg så mye, og hvordan det angår deg.

Hvorfor størrelse betyr noe

Ved å redusere innholdet i Docker-bildet reduserer vi dermed listen over sårbarheter. I tillegg gjør vi bildene renere, fordi de bare inneholder det som trengs for å kjøre applikasjoner.

Det er en liten fordel til - bilder lastes ned litt raskere, men etter min mening er dette ikke så viktig.

Merk: Hvis du er bekymret for størrelsen, er selve alpine-utseendet små og vil sannsynligvis passe deg.

Distroløse bilder

Prosjekt Distroless tilbyr et utvalg grunnleggende "distroless" bilder, de inneholder ikke pakkebehandlere, skjell og andre verktøy som du er vant til å se på kommandolinjen. Som et resultat, bruk pakkeadministratorer som pip и apt vil ikke fungere:

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

Dockerfil som bruker Python 3 distroless bilde

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å bildet

Vanligvis løses dette problemet ved å bygge flere trinn:

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/

Flertrinns montering

Resultatet er et bilde på 130 MB. Ikke værst! Til sammenligning: standard Python-bilde veier 929 MB, og det "tynnere" (3,7-slim) - 179 MB, alpint bilde (3,7-alpine) er 98,6 MB, mens det grunnleggende distroløse bildet som brukes i eksemplet er 50,9 MB.

Det er rettferdig å påpeke at i det forrige eksemplet kopierer vi en hel katalog /usr/local/lib/python3.7/site-packages, som kan inneholde avhengigheter som vi ikke trenger. Selv om det er klart at størrelsesforskjellen på alle eksisterende Python-basebilder varierer.

I skrivende stund støtter ikke Google distroless mange bilder: Java og Python er fortsatt på det eksperimentelle stadiet, og Python eksisterer bare for 2,7 og 3,5.

Små bilder

Tilbake til min besettelse med å lage små bilder.

Generelt ønsket jeg å se hvordan distroløse bilder er konstruert. Det distroless-prosjektet bruker Googles byggeverktøy bazel. Men å installere Bazel og skrive dine egne bilder tok mye arbeid (og for å være ærlig er det morsomt og lærerikt å finne opp hjulet på nytt). Jeg ønsket å forenkle opprettelsen av mindre bilder: handlingen med å lage et bilde skal være ekstremt enkel, banal. Slik at det ikke er noen konfigurasjonsfiler for deg, bare én linje i konsollen: просто собрать образ для <приложение>.

Så hvis du vil lage dine egne bilder, så vit: det er et så unikt docker-bilde, scratch. Scratch er et "tomt" bilde, det er ingen filer i det, selv om det veier som standard - wow! - 77 byte.

FROM scratch

Skrape bildet

Ideen med et skrapebilde er at du kan kopiere alle avhengigheter fra vertsmaskinen inn i det og enten bruke dem i en Dockerfile (dette er som å kopiere dem til apt og installer fra bunnen av), eller senere når Docker-bildet er materialisert. Dette lar deg kontrollere innholdet i Docker-beholderen fullstendig, og dermed fullstendig kontrollere størrelsen på bildet.

Nå må vi på en eller annen måte samle disse avhengighetene. Eksisterende verktøy som apt lar deg laste ned pakker, men de er knyttet til den gjeldende maskinen og støtter tross alt ikke Windows eller MacOS.

Så jeg satte meg for å bygge mitt eget verktøy som automatisk ville bygge et basisbilde av minst mulig størrelse og også kjøre en hvilken som helst applikasjon. Jeg brukte Ubuntu/Debian-pakker, gjorde et valg (henter pakker direkte fra depotene) og fant rekursivt avhengighetene deres. Programmet skulle automatisk laste ned den siste stabile versjonen av pakken, og minimere sikkerhetsrisikoen så mye som mulig.

Jeg kalte verktøyet fetchy, fordi han ... finner og bringer ... det som trengs [fra engelsk "hente", "bringe" - ca. kjørefelt]. Verktøyet fungerer gjennom et kommandolinjegrensesnitt, men tilbyr samtidig en API.

For å sette sammen et bilde ved hjelp av fetchy (la oss ta et Python-bilde denne gangen), du trenger bare å bruke CLI slik: fetchy dockerize python. Du kan bli spurt om måloperativsystemet og kodenavnet fordi fetchy bruker foreløpig bare pakker basert på Debian og Ubuntu.

Nå kan du velge hvilke avhengigheter som ikke er nødvendig i det hele tatt (i vår sammenheng) og ekskludere dem. For eksempel er Python avhengig av perl, selv om det fungerer fint uten Perl installert.

Funn

Python-bilde opprettet ved hjelp av kommandoen fetchy dockerize python3.5 veier kun 35MB (jeg er mer enn sikker på at den i fremtiden kan gjøres enda lettere). Det viser seg at vi klarte å barbere bort ytterligere 15 WW fra det distroløse bildet.

Du kan se alle bildene som er samlet så langt her.

Prosjekt - her.

Hvis du mangler funksjoner, er det bare å lage en forespørsel - jeg hjelper deg gjerne :) Enda mer, jeg jobber for tiden med å integrere andre pakkeadministratorer i fetchy, slik at det ikke er behov for flertrinnsbygg.

Kilde: www.habr.com

Legg til en kommentar