Sobes.tech
Middle

Jak używasz wieloetapowego budowania (multistage) do optymalizacji obrazów Docker?

sobes.tech AI

Odpowiedź od AI

Wieloetapowe budowanie pozwala na użycie kilku etapów (layers) w Dockerfile, gdzie każdy etap wykonuje swoje zadanie. Wynik jednego etapu (np. skompilowany artefakt) jest przekazywany do następnego etapu, ale warstwy pośrednie poprzednich etapów nie są dołączane do końcowego obrazu.

Przykład użycia do kompilacji aplikacji Go:

# Etap budowania
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp

# Etap końcowy
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

Zalety:

  • Zmniejszenie rozmiaru obrazu: W końcowym obrazie znajduje się tylko skompilowana aplikacja i niezbędne zależności, a nie narzędzia do budowania, kod źródłowy czy pliki pośrednie.
  • Oddzielenie logiki: Logika kompilacji/uruchomienia jest oddzielona od logiki wdrożenia.
  • Zwiększone bezpieczeństwo: Zmniejsza powierzchnię ataku przez wykluczenie niepotrzebnych narzędzi i bibliotek z końcowego obrazu.
  • Przyspieszenie budowania: Pamięć podręczna warstw między etapami może przyspieszyć ponowne budowanie.

Na przykład, w podanym Dockerfile, pierwszy etap builder służy do kompilacji aplikacji Go. Drugi etap, rozpoczynający się od FROM alpine:latest, kopiuje tylko skompilowaną aplikację z pierwszego etapu (COPY --from=builder /app/myapp /app/) do czystego obrazu bazowego. Ostateczny obraz zawiera tylko plik wykonywalny i podstawowy system operacyjny, bez kompilatora Go i kodu źródłowego.

To znacznie zmniejsza rozmiar obrazu w porównaniu z tradycyjnym podejściem, gdy kompilacja i uruchomienie odbywają się w jednym kontenerze.