Jak používáte vícestupňovou (multistage) sestavu k optimalizaci obrazů Docker?
sobes.tech AI
Odpověď od AI
Vícefázová sestava umožňuje používat v Dockerfile více etap (layers), přičemž každá etapa plní svůj vlastní úkol. Výsledek jedné etapy (například zkompilovaný artefakt) je předán další etapě, ale mezilehlé vrstvy předchozích etap nejsou zahrnuty do finálního obrazu.
Příklad použití pro sestavení Go aplikace:
# Fáze sestavení
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Finální fáze
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Výhody:
- Zmenšení velikosti obrazu: Ve finálním obraze je pouze sestavená aplikace a potřebné závislosti, nikoli nástroje pro sestavení, zdrojový kód nebo mezilehlé soubory.
- Oddělení zodpovědností: Logika sestavení/deploy je oddělena od logiky nasazení.
- Zvýšení bezpečnosti: Snížení povrchu útoku odstraněním zbytečných nástrojů a knihoven z finálního obrazu.
- Zrychlení sestavení: Ukládání do mezipaměti vrstev mezi etapami může urychlit opakované sestavení.
Například v poskytnutém Dockerfile je první vrstva builder použita k sestavení Go aplikace. Druhá vrstva, začínající s FROM alpine:latest, kopíruje pouze zkompilovanou aplikaci z první vrstvy (COPY --from=builder /app/myapp /app/) do čistého základního obrazu. Výsledný obraz obsahuje pouze spustitelný soubor a základní operační systém, bez Go kompilátoru a zdrojového kódu.
To výrazně snižuje velikost obrazu ve srovnání s tradičním přístupem, kdy sestavení a spuštění probíhají v jednom kontejneru.