Ako používate viacstupňovú (multistage) zostavu na optimalizáciu Docker obrázkov?
sobes.tech AI
Odpoveď od AI
Viacstupňová zostava umožňuje používať v Dockerfile viacero etáp (layers), pričom každá etapa plní svoju vlastnú úlohu. Výsledok jednej etapy (napríklad skompilovaný artefakt) sa prenáša do ďalšej etapy, ale medzivrstvy predchádzajúcich etáp sa nezahrnujú do finálneho obrazu.
Príklad použitia na zostavenie Go aplikácie:
# Etapa zostavenia
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Finálna etapa
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Výhody:
- Zníženie veľkosti obrazu: Vo finálnom obraze je iba skompilovaná aplikácia a potrebné závislosti, nie nástroje na zostavenie, zdrojový kód alebo medzivrstvy.
- Oddelenie zodpovedností: Logika zostavenia/deploy je oddelená od logiky nasadenia.
- Zvýšená bezpečnosť: Znižuje sa povrch útoku odstránením zbytočných nástrojov a knižníc z finálneho obrazu.
- Zrýchlenie zostavovania: Cache vrstiev medzi etapami môže zrýchliť opakované zostavovanie.
V príklade Dockerfile je prvá vrstva builder použitá na zostavenie Go aplikácie. Druhá vrstva, začínajúca s FROM alpine:latest, kopíruje iba skompilovanú aplikáciu z prvej vrstvy (COPY --from=builder /app/myapp /app/) do čistého základného obrazu. Výsledný obraz obsahuje iba spustiteľný súbor a základný operačný systém, bez Go kompilátora a zdrojového kódu.
Toto výrazne znižuje veľkosť obrazu v porovnaní s tradičným prístupom, keď sa zostavovanie a spustenie vykonávajú v jednom kontejnery.