1

Docker a viacfázové zostavenie (_multistage builds_). | robonovotny

 1 year ago
source link: https://novotnyr.github.io/scrolls/docker-multistage-builds/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Viacfázové zostavenie — multistage build * — umožňuje optimalizovať veľkosť dockerovských imagov.

Typická situácia v mnohých projektoch:

Fáza 1: kompilácia
  • stiahnu sa nástroje na zostavenie projektu: kompilátory, správcovia balíčkov

  • zostaví sa projekt z binárok, zbehne kompilácia

Fáza 2: finálny image
  • vytvorí sa image obsahujúci len samotné binárky, a ak treba, tak platformu (Java, Node.js)

Implementácia (Typescript nad Node.js)

Každá fáza je reprezentovaná inštrukciou FROM.

Dockerfile
1 Budujeme cez Node.js. Direktíva AS dá fáze meno, aby sme sa na ňu v ďalších fázach vedeli odkázať.
2 Spustíme inštaláciu balíčkov.
3 Skopírujeme zdrojáky z kontextu do imagu.
4 Spustíme kompilačný krok.
5 Fáza dva: tvorba finálneho imagu.
6 Inštrukcia COPY dokáže kopírovať súbory z predošlých fáz. --from=builder kopíruje hotové výsledky kompilácie z predošlej fázy do pracovného adresára (bodka .).

Buildujeme štandardne:

docker build --tag novotnyr/hello-ts $PWD
Výsledný image je omnoho menší než celý image s Typescriptom — ušetrí sa zhruba 80 MB.

Implementácia (jazyk C)

Ukážme si projekt pre jazyk C:

Dockerfile
1 Používame image pre kompilátor gcc
2 Pracovný adresár, do ktorého skopírujeme zdrojáky.
3 Spustíme kompiláciu. Používame exec formu, ktorá nevolá kompilátor zo shellu, ale priamo.
4 Používame minimalistický image bez shellu a nástrojov.
5 Nastavíme binárku zero ako vstupný bod, ktorý sa zavolá automaticky pri docker run.

Implementácia (Java)

Dockerfile
1 Definujeme argument pre adresár so zdrojákmi a adresár pre binárky. Táto inštrukcia sa bude znovupoužívať vo fázach.
2 Budujeme cez Maven.
3 Deklarujeme argumenty, ktoré sme definovali v spoločnej sekcii pred prvou inštrukciou FROM.
4 Definujeme pracovný adresár.
5 Skopírujeme zdrojáky. Pozor na to, že kopírovanie adresára kopíruje len jeho obsah, nie adresár samotný!
6 Premenujeme binárku tak, aby sme z nej odstránili číslo verzie, ktoré do nej dá Maven.
7 Fáza 2: bežíme nad Javou.
8 Skopírujeme binárku (JAR) z predošlej fázy
9 Nastavíme vstupný bod do kontajnera.

Budujeme:

docker build --tag docker-java-build $PWD

Spúšťame:

docker run --rm -it docker-java-build

>> Home


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK