Sobes.tech
Middle

W jakich przypadkach stosuje się wieloetapowe (multi-stage) budowanie?

sobes.tech AI

Odpowiedź od AI

Wieloetapowa kompilacja (multi-stage build) w Dockerze jest używana w następujących przypadkach:

  1. Zmniejszenie rozmiaru końcowego obrazu: W pierwszej (lub pośredniej) warstwie kompilacji znajdują się narzędzia potrzebne do kompilacji, testów lub innych etapów budowania (np. kompilator, zależności kompilacji). W drugiej (końcowej) warstwie kopiowane są tylko artefakty niezbędne do uruchomienia aplikacji (skompilowany kod, pliki wykonywalne, biblioteki czasu wykonania). Zapobiega to dołączeniu do końcowego obrazu niepotrzebnych zależności i narzędzi, co znacznie zmniejsza jego rozmiar.
  2. Oddzielenie etapów budowania i uruchamiania: Jasne rozdzielenie ułatwia zrozumienie procesu budowania i debugowania. Można mieć etapy do kompilacji kodu źródłowego, uruchamiania testów, lintowania, a następnie tworzenia końcowego obrazu z gotową do wdrożenia aplikacją.
  3. Poprawa bezpieczeństwa: Końcowy obraz zawiera minimalną niezbędną ilość komponentów, co zmniejsza powierzchnię ataku. Narzędzia do budowania i kod źródłowy, które mogą zawierać luki bezpieczeństwa, nie trafiają do obrazu używanego w produkcji.
  4. Przyspieszenie budowania (w niektórych przypadkach): Obrazy pośrednie mogą być buforowane, a przy zmianach tylko na ostatnich etapach budowania nie trzeba przebudowywać wszystkiego od nowa.
  5. Ujednolicenie procesu budowania: Budowa aplikacji i tworzenie jej obrazu Docker stają się jednym zautomatyzowanym procesem w jednym pliku Dockerfile, co upraszcza pipeline CI/CD.

Przykład użycia dla aplikacji w Go:

# Etap budowania
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
# Kompilacja pliku wykonywalnego
RUN go build -ldflags="-s -w" -o myapp .

# Etap końcowy
FROM alpine:latest
WORKDIR /app
# Kopiujemy tylko plik wykonywalny z poprzedniego etapu
COPY --from=builder /app/myapp .
# Komenda do uruchomienia aplikacji
CMD ["./myapp"]