de Kumar Rishav

Cum să utilizați versiunile Docker în mai multe etape pentru a vă optimiza fișierele și imaginile docker

Cum sa utilizati versiunile Docker in mai multe etape pentru
Fotografie de Jose Carbajal pe Unsplash

Build-urile în mai multe etape sunt o nouă caracteristică care necesită Docker 17.05 sau o versiune ulterioară pentru daemon și client. Sunt utile în construirea de imagini complexe / cu mai multe etape, păstrându-le în același timp ușor de citit și întreținut.

Menținerea dimensiunii imaginii în jos este una dintre sarcinile provocatoare în timpul construirii imaginii. Fiecare instrucțiune din fișierul Docker adaugă un strat imaginii. De asemenea, trebuie să vă amintiți să curățați eventualele dependențe / artefacte de care nu aveți nevoie mai târziu. Înainte, este posibil să fi folosit scripturi shell pentru a menține straturile ușoare cât mai mult posibil. Dar utilizarea trucurilor de shell pentru a scrie un Dockerfile cu adevărat eficient este o sarcină dureroasă.

Ce sunt mai exact construcțiile în mai multe etape?

În termeni simpli: puteți utiliza rezultatul final (de exemplu: fișier binar / executabil) al unei etape într-o altă etapă, fără a vă face griji cu privire la dependențele utilizate pentru a construi acel fișier binar / executabil.

Cum functioneazã?

Cu versiunile în mai multe etape, puteți avea mai multe FROM declarație într-un singur fișier Docker. Fiecare FROM declarația contribuie la o etapă. Prima etapă începe de la număr 0.

FROM mhart/alpine-node:10  #stage 0
.......
FROM alpine:3.7 #stage 1

Aici, ordinea etapelor contează, deoarece prima etapă va fi întotdeauna 0. O altă modalitate este de a da un nume fișierului stage prin utilizarea AS. În acest caz, nu trebuie să vă faceți griji cu privire la comandă.

FROM mhart/alpine-node:10 AS nodebuilder
.......
FROM alpine:3.7 AS builder

Demonstrarea versiunilor în mai multe etape

Infrastructură testată: Joacă-te cu Docker

În scop demonstrativ, să luăm în considerare o aplicație simplă nodejs și să construim un binar din ea. Când executați acest binar, acesta va apela un Api NASA care returnează câteva fapte interesante despre data de astăzi.

Înainte: imagini docker

Cum sa utilizati versiunile Docker in mai multe etape pentru
înainte: imagini_docker

În prezent avem două imagini din care am tras dockerhub:

  • alpine (~4Mb) – Cea mai ușoară versiune a sistemului de operare Linux
  • alpine-node (~70Mb) – alpin + Nod / Npm și alte dependențe.

Structura fișierului

1611322144 76 Cum sa utilizati versiunile Docker in mai multe etape pentru

Dockerfile:

  • Pe scena 0 (alias: builder), noi avem un alpine-node OS care are node și npm construit în el. Dimensiunea sa este ~70Mb. Această etapă va crea un binar (denumit nasa : Linia 6) în curent WORKDIR adică app/.
  • Pe etapa 1, noi avem alpine OS. După aceea, instalăm câteva dependențe necesare. În Line 14, am copiat nasa binar din etapa anterioară (builder) la stadiul actual. Deci, doar am copiat binarul și lăsăm totul greu alpine-node OS și alte dependențe precum npm (manager de pachete nod) etc în spate, deoarece binarul are deja dependențele necesare (cum ar fi nodejs) încorporate.

app/ :

  • Este doar o aplicație nod simplă. Face o https apelați și preluați date folosind API-ul NASA. Are index.js și package.json. am folosit pkg pentru a construi nodul binar. Iată aplicația cod.

După: imagini docker

1611322144 293 Cum sa utilizati versiunile Docker in mai multe etape pentru
după: imagini docker

multietape: 1.0.0 (56b102754f6d) este imaginea finală necesară pe care am construit-o. Dimensiunea sa este ~45Mb. Aproape 1/4 a imaginii intermediare (13bac50ebc1a) construit pe etapa 0 și aproape jumatate din alpine-node imagine.

Așadar, acesta a fost un exemplu simplu pentru a prezenta caracteristica de construire în mai multe etape. Pentru imaginile care au mai mulți pași (cum ar fi instrucțiunea 10-15 FROM), veți găsi această caracteristică foarte utilă.

Folosiți o imagine externă ca „scenă”

Când utilizați versiuni cu mai multe etape, nu vă limitați la copierea din etapele create anterior în fișierul Docker. Puteți utiliza COPY --from instrucțiuni de copiere dintr-o imagine separată, fie folosind numele imaginii locale, o etichetă disponibilă local sau într-un registru Docker, fie un ID de etichetă.

COPY --from=sampleapp:latest home/user/app/config.json app/config.json

Mulțumesc.

Mulțumiri Ajeet pentru revizuirea blogului.

Postat inițial la colabnix: https://lnkd.in/fJaC6gp.