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:
- 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.
- 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ą.
- 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.
- 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.
- 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"]