Pienet Docker-kuvat, jotka uskoivat itseensä*

[viittaus amerikkalaiseen lastensatuun "The Little Engine That Could" - noin. kaista]*

Pienet Docker-kuvat, jotka uskoivat itseensä*

Kuinka luoda automaattisesti pieniä Docker-kuvia tarpeisiisi

Epätavallinen pakkomielle

Olen parin viime kuukauden ajan ollut pakkomielle siitä, kuinka pieni Docker-kuva voi olla ja onko sovellus edelleen käynnissä?

Ymmärrän, ajatus on outo.

Ennen kuin menen yksityiskohtiin ja teknisiin seikkoihin, haluaisin selittää, miksi tämä ongelma vaivasi minua niin paljon ja kuinka se koskee sinua.

Miksi koolla on väliä

Vähentämällä Docker-kuvan sisältöä vähennämme haavoittuvuuksien luetteloa. Lisäksi teemme kuvista puhtaampia, koska ne sisältävät vain sen, mitä tarvitaan sovellusten suorittamiseen.

On vielä yksi pieni etu - kuvat ladataan hieman nopeammin, mutta mielestäni tämä ei ole niin tärkeää.

Huomaa: Jos olet huolissasi koosta, Alpine-ulkoasut ovat itse pieniä ja sopivat todennäköisesti sinulle.

Distroless kuvia

Projekti Distroless tarjoaa valikoiman "distroless" peruskuvia, ne eivät sisällä paketinhallintaohjelmia, komentotuloksia ja muita apuohjelmia, joita olet tottunut näkemään komentorivillä. Tämän seurauksena käytä paketinhallintaohjelmia, kuten pip и apt ei toimi:

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

Dockerfile käyttäen Python 3 distroless -kuvaa

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 ei ole kuvassa

Yleensä tämä ongelma ratkaistaan ​​monivaiheisella rakennuksella:

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/

Monivaiheinen kokoonpano

Tuloksena on 130 megatavun kokoinen kuva. Ei paha! Vertailun vuoksi: Python-oletuskuva painaa 929 Mt ja "ohuempi" (3,7-slim) - 179 Mt, alppikuva (3,7-alpine) on 98,6 Mt, kun taas esimerkissä käytetty peruskuva on 50,9 Mt.

On kohtuullista huomauttaa, että edellisessä esimerkissä kopioimme kokonaista hakemistoa /usr/local/lib/python3.7/site-packages, joka voi sisältää riippuvuuksia, joita emme tarvitse. Vaikka on selvää, että kaikkien olemassa olevien Python-peruskuvien kokoero vaihtelee.

Kirjoitushetkellä Google distroless ei tue monia kuvia: Java ja Python ovat vielä kokeiluvaiheessa, ja Python on olemassa vain versioille 2,7 ja 3,5.

Pieniä kuvia

Takaisin pakkomielleeni pienten kuvien luomisesta.

Yleisesti ottaen halusin nähdä, kuinka distroless-kuvia rakennetaan. Distroless-projekti käyttää Googlen rakennustyökalua bazel. Bazelin asentaminen ja omien kuvien kirjoittaminen vaati kuitenkin paljon työtä (ja ollakseni rehellinen, pyörän keksiminen uudelleen on hauskaa ja opettavaista). Halusin yksinkertaistaa pienempien kuvien luomista: kuvan luomisen tulisi olla erittäin yksinkertaista, banaali. Jotta sinua varten ei ole asetustiedostoja, vain yksi rivi konsolissa: просто собрать образ для <приложение>.

Joten jos haluat luoda omia kuviasi, tiedä: siellä on ainutlaatuinen telakointikuva, scratch. Scratch on "tyhjä" kuva, siinä ei ole tiedostoja, vaikka se painaa oletuksena - vau! - 77 tavua.

FROM scratch

Scratch kuva

Raaputuskuvan ideana on, että voit kopioida kaikki riippuvuudet isäntäkoneesta siihen ja joko käyttää niitä Docker-tiedoston sisällä (tämä on kuin kopioiisi ne apt ja asenna alusta) tai myöhemmin, kun Docker-näköistiedosto toteutuu. Tämän avulla voit hallita täysin Docker-säiliön sisältöä ja siten hallita täysin kuvan kokoa.

Nyt meidän on jotenkin kerättävä nämä riippuvuudet. Nykyiset työkalut, esim apt mahdollistaa pakettien lataamisen, mutta ne on sidottu nykyiseen koneeseen, eivätkä ne loppujen lopuksi tue Windowsia tai MacOS:ää.

Niinpä päätin rakentaa oman työkaluni, joka rakentaisi automaattisesti mahdollisimman pienikokoisen peruskuvan ja ajaisi myös mitä tahansa sovelluksia. Käytin Ubuntu/Debian-paketteja, tein valinnan (sain paketteja suoraan arkistoista) ja löysin rekursiivisesti niiden riippuvuudet. Ohjelman piti automaattisesti ladata uusin vakaa versio paketista, minimoiden tietoturvariskit mahdollisimman paljon.

Nimesin työkalun fetchy, koska hän... löytää ja tuo... mitä tarvitaan [englannista "hae", "tuo" - n. kaista]. Työkalu toimii komentorivikäyttöliittymän kautta, mutta tarjoaa samalla API:n.

Voit koota kuvan käyttämällä fetchy (Otetaan tällä kertaa Python-kuva), sinun tarvitsee vain käyttää CLI:tä seuraavasti: fetchy dockerize python. Sinulta saatetaan kysyä kohdekäyttöjärjestelmää ja koodinimeä, koska fetchy käyttää tällä hetkellä vain Debianiin ja Ubuntuun perustuvia paketteja.

Nyt voit valita, mitkä riippuvuudet eivät ole ollenkaan tarpeen (meidän kontekstissamme) ja sulkea ne pois. Esimerkiksi Python riippuu perlistä, vaikka se toimii hyvin ilman Perliä asennettuna.

Tulokset

Python-kuva luotu komennolla fetchy dockerize python3.5 painaa vain 35 Mt (olen enemmän kuin varma, että tulevaisuudessa siitä voidaan tehdä vielä kevyempi). Kävi ilmi, että onnistuimme ajamaan pois vielä 15 WW distroless-kuvasta.

Näet kaikki tähän mennessä kerätyt kuvat täällä.

Projekti - täällä.

Jos sinulta puuttuu ominaisuuksia, luo vain pyyntö - autan mielelläni :) Ja vielä enemmän, työskentelen parhaillaan muiden pakettien hallintaohjelmien integroimiseksi fetchyyn, jotta monivaiheisia koontiversioita ei tarvita.

Lähde: will.com

Lisää kommentti