[referanse til det amerikanske barneeventyret «Den lille lokomotivet som kunne» – overs. merknad]*

Slik lager du automatisk små docker-bilder for dine behov
En uvanlig besettelse
De siste par månedene har jeg vært besatt av denne ideen: hvor mye mindre kan et Docker-bilde være og fortsatt få applikasjonen til å fungere?
Jeg forstår, ideen er merkelig.
Før jeg går inn på detaljene og det tekniske, vil jeg gjerne avklare hvorfor dette problemet har meg så hekta og hvordan det påvirker deg.
Hvorfor størrelsen er viktig
Ved å redusere innholdet i Docker-avbildningen, reduserer vi listen over sårbarheter. I tillegg gjør vi avbildningene renere, fordi de bare inneholder det som trengs for å kjøre applikasjoner.
Det er én liten fordel til – bilder lastes ned litt raskere, men etter min mening er ikke dette så viktig.
Merk: Hvis du er bekymret for størrelsen, er Alpine-bildene små i størrelsen og vil sannsynligvis passe deg.
Distroløse bilder
tilbyr et utvalg av grunnleggende "distroless"-avbildninger, de inneholder ikke pakkebehandlere, skall og andre verktøy som du er vant til å se i kommandolinjen. Som et resultat, bruk av pakkebehandlere som pip и apt det vil ikke fungere:
FROM gcr.io/distroless/python3
RUN pip3 install numpy
Dockerfile ved bruk av Python 3 distroless image
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 med på bildet
Vanligvis løses dette problemet ved montering i 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
Det resulterende bildet er 130 MB stort. Ikke så verst! Til sammenligning: standard Python-bildet veier 929 MB, og det "slankere" (3,7-slim) — 179 MB, alpint bilde (3,7-alpine) – 98,6 MB, mens det grunnleggende distroløse bildet som brukes i eksemplet er 50,9 MB.
Det kan med rette påpekes at i det forrige eksemplet kopierer vi en hel katalog /usr/local/lib/python3.7/site-packages, som kan inneholde avhengigheter vi ikke trenger. Selv om det er tydelig at forskjellen i størrelsene på alle eksisterende Python-basisbilder varierer.
I skrivende stund støtter ikke Google Distroless mange images: Java og Python er fortsatt eksperimentelle, og Python finnes bare for 2,7 og 3,5.
Små bilder
La oss vende tilbake til min besettelse med å lage små bilder.
Generelt sett ville jeg se hvordan distroless-bilder bygges. Distroless-prosjektet bruker Googles byggeverktøy. bazelDet krevde imidlertid litt arbeid å installere Bazel og lage dine egne bilder (og for å være helt ærlig, det er morsomt og lærerikt å finne opp hjulet på nytt). Jeg ønsket å forenkle opprettelsen av nedskalerte bilder: selve handlingen med å lage et bilde skulle være ekstremt enkel, banalSå ingen konfigurasjonsfiler for deg, bare én linje i konsollen: просто собрать образ для <приложение>.
Så, hvis du vil lage dine egne bilder, så vit: det finnes et så unikt docker-bilde, scratchScratch er et «tomt» bilde, det har ingen filer, selv om det veier som standard – wow! – 77 byte.
FROM scratch
Bildeskrap
Ideen bak scratch-imaget er at du kan kopiere eventuelle avhengigheter fra vertsmaskinen inn i det og enten bruke dem i Dockerfile (det er som å kopiere dem inn i apt og installere fra bunnen av), eller senere, når Docker-avbildningen er materialisert. Dette gir deg full kontroll over innholdet i Docker-containeren, og dermed full kontroll over størrelsen på avbildningen.
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 gjeldende maskin og støtter til syvende og sist ikke Windows eller MacOS.
Så jeg bestemte meg for å bygge mitt eget verktøy som automatisk ville bygge et basisbilde av minste mulige størrelse og få det til å kjøre ethvert program. Jeg brukte pakker Ubuntu/Debian, utførte et utvalg (hentet pakker direkte fra repositorier) og fant rekursivt avhengighetene deres. Programmet skulle automatisk laste ned den nyeste stabile versjonen av pakken, noe som minimerte sikkerhetsrisikoer.
Jeg ga instrumentet navn fetchy, fordi han … finner og bringer … det som trengs [fra engelsk «hente», «å bringe» - overs. merknadVerktøyet fungerer via et kommandolinjegrensesnitt, men tilbyr samtidig et API.
For å sette sammen et bilde ved hjelp av fetchy (la oss ta et Python-image denne gangen), du trenger bare å bruke CLI-en slik: fetchy dockerize pythonDu kan bli spurt om måloperativsystemet og kodenavnet fordi fetchy bruker for øyeblikket bare pakker basert på Debian и Ubuntu.
Nå kan du velge hvilke avhengigheter som ikke er nødvendige i det hele tatt (i vår kontekst) og ekskludere dem. For eksempel er Python avhengig av Perl, selv om det fungerer fint uten Perl installert.
Funn
Python-bilde opprettet med kommandoen fetchy dockerize python3.5 veier bare 35 MB (jeg er mer enn sikker på at den kan bli enda lysere i fremtiden). Det viser seg at vi klarte å "barbere" ytterligere 15 MB av det distroløse bildet.
Du kan se alle bildene som er samlet inn så langt .
Prosjekt - .
Hvis du mangler funksjoner, er det bare å opprette en forespørsel – jeg hjelper deg gjerne :) Dessuten jobber jeg for tiden med å integrere andre pakkebehandlere i fetchy, slik at behovet for flertrinnsbygg forsvinner.
Kilde: www.habr.com
