Hyppää sisältöön

Welcome to our weekly research support coffee hour on Zoom! Click here for more information.

Warning!

Puhti scratch disk is becoming very full (80+ % ) resulting in performance degradation. Everybody is advised to only keep actively processed data on scratch, all other data should be deleted, transferred to host institute or stored in Lumi-O. No new quota will be granted. Click here for a tool for examining your disk usage.

Docker-imagien pitäminen pieninä

On tärkeää pitää Docker-imaget pieninä. Mitä pienempi image on, sitä nopeammin se vedetään käyttöön, mikä nopeuttaa julkaisuja sekä tuotanto- että kehitysympäristöissä. Lisäksi suuremmat imaget poistuvat noodien välimuistista nopeammin. Rahtin sisäiseen rekisteriin tallennettavan imagen enimmäiskoko on 5 Gt. Yli 1 Gt:n imagia pidetään jo erittäin suurena.

Mieti tarkkaan, mitä imageen lisätään

Ensimmäinen tapa pitää image pienenä on yksinkertaisesti olla lisäämättä tarpeettomia tiedostoja. Kehitysvaiheessa on tavallista asentaa kirjastojen tai muiden riippuvuuksien täydet lähdekoodit, esimerkiksi Linux-ytimen otsaketiedostot. Näitä lähdekoodeja ei enää tarvita tuotantoympäristön julkaisuissa.

Pidä data poissa imagesta

Imagien tulisi sisältää vain sovelluksen ajoaikainen ympäristö. Tämä tarkoittaa, että sovelluksen suorittamiseen tarvittavaa dataa ei pidä lisätä imageen. Näin image ei ole ainoastaan pienempi, vaan vältämme myös uudelleenrakennuksen silloin, kun data muuttuu. Data voidaan tallentaa ulkoiseen taltioon (PVC), joka liitetään podiin käynnistyksen yhteydessä, tai se voidaan tallentaa Altaaseen ja ladata palveluun käynnistyksen aikana tai tarvittaessa pyynnöstä. Datan tallentaminen Altaaseen edellyttää sovellukselta lisälogiikkaa (tai esilatausskriptiä), joka ymmärtää, missä data sijaitsee ja miten se haetaan. data voidaan tallentaa ulkoiseen taltioon (PVC), joka liitetään podiin käynnistyksen yhteydessä, tai se voidaan tallentaa

Vähennä kerrosten määrää

Jokaisesta Dockerfile-ohjeesta (RUN, COPY, CMD, EXPOSE, ...) lisätään Docker-imageen uusi kerros. Jokainen kerros tallennetaan erona edelliseen. Tämä tarkoittaa, että jos jotakin dataa lisätään yhdessä kerroksessa mutta poistetaan seuraavassa, image sisältää silti kyseisen datan. Jos haluat nähdä, kuinka paljon dataa kukin kerros lisää imageen, voit käyttää komentoa:

docker history image_name

Kerrosten määrän vähentämiseen on 3 lähestymistapaa:

  • Yhdistä kerroksia Dockerfile-tiedostossa. Joskus useita RUN-ohjeita on peräkkäin. Ne voidaan helposti yhdistää käyttämällä &&-operaattoria:
RUN apt update

RUN apt install git

muuttuu muotoon:

RUN apt update && \
    apt install git
  • Käytä monivaiheisia koonteja (tämä ominaisuus otettiin käyttöön Dockerin versiossa 17.05). Monivaiheisten koontien idea on, että samassa Dockerfile-tiedostossa on useita FROM-komentoja. Jokainen FROM aloittaa uuden vaiheen koonnissa eikä tuo mukanaan edellisen vaiheen tiedostoja, mutta sallii tiedostojen kopioimisen aiemmista vaiheista. Tässä käytetty malli on se, että sovellus kootaan ensimmäisessä vaiheessa ja toisessa vaiheessa kopioidaan vain käännetty sovellus, jolloin lähdekoodit ja muut käännöksen sivutuotteet, joita ei tarvita sovelluksen suorittamiseen, jäävät pois. Esimerkiksi:
FROM golang:1.21
WORKDIR /src

RUN echo 'package main\n\
\nimport "fmt"\nfunc main() {\nfmt.Println("hello, world")\n}' >main.go

RUN go build -o /bin/hello ./main.go && cat main.go

FROM scratch
COPY --from=0 /bin/hello /bin/hello
CMD ["/bin/hello"]

Esimerkki on otettu Dockerin dokumentaation artikkelista Use multi-stage builds.

  • Käytä komentoa docker build --squash. Docker litistää imagen yhdeksi kerrokseksi. Tämä tarkoittaa, että jos Dockerfile tuottaa useita kerroksia, jotka muokkaavat samoja tiedostoja, vain tiedostojen lopullinen tila tallennetaan. Samoin jos tiedosto luodaan yhdessä kerroksessa ja poistetaan myöhemmin toisessa, tiedostoa ei tallenneta imageen.

Käytä pientä pohjaimagea

Imagea luotaessa pohjaimagen valinta on tärkeä tehtävä. Tiettyyn tarpeeseen on lähes aina saatavilla useita pohjaimageja. Nämä pohjaimaget voivat erota toisistaan huomattavasti sisällön, ylläpidon, tietoturvan, koon jne. osalta. On hyvä käytäntö arvioida saatavilla olevia imageja ja tehdä niiden välillä vertailuja. Usein ei ole hyvä ajatus ottaa ensimmäistä satunnaista löytämääsi imagea ja viedä sitä tuotantoon. Yksi hyvin yleisesti käytetty pohjaimage, josta on saatavilla paljon dokumentaatiota, on Alpine Linux.

Alpine Linux on tietoturvapainotteinen, kevyt Linux-jakelu, joka perustuu musl libc- ja busybox-ohjelmistoihin.

Tällä hetkellä Alpinen pohjaimage (docker.io/alpine) on vain 5,61 Mt. Vertailun vuoksi Ubuntun ja AlmaLinuxin pohjaimagien koot ovat 72,9 Mt ja 189 Mt. Alpinen suurin haittapuoli verrattuna muihin pohjaimageihin on se, että jotkin sovellukset eivät ole yhteensopivia musl libc -kirjaston kanssa ja vaativat glibc:n. Alpinella on myös pienempi valikoima ohjelmistoja saatavilla repositorioissa kuin Ubuntulla tai AlmaLinuxilla.

Käytä .dockerignore-tiedostoa

.dockerignore toimii samalla tavalla kuin gitignore: se luo estolistan tiedostoista, joita ei lisätä imageen. Tällä tavoin on mahdollista sulkea pois tiedostoja, joita ei tarvita sovelluksen suorittamiseen.

Suomenkielinen tekoälykäännös

Sisällössä voi esiintyä virheellistä tietoa tekoälykäännöksestä johtuen.

Klikkaa tästä antaaksesi palautetta