Middle
In welke gevallen wordt een multi-stage build gebruikt?
sobes.tech AI
Antwoord van AI
De multi-stage build in Docker wordt in de volgende gevallen gebruikt:
- Vermindering van de grootte van de uiteindelijke afbeelding: In de eerste (of tussenliggende) laag van de build bevinden zich de tools die nodig zijn voor compilatie, testen of andere bouwstappen (bijvoorbeeld compiler, build-afhankelijkheden). In de tweede (definitieve) laag worden alleen de artefacten gekopieerd die nodig zijn om de applicatie uit te voeren (gecompileerde code, uitvoerbare bestanden, runtime-bibliotheken). Dit voorkomt dat onnodige afhankelijkheden en bouwtools in de uiteindelijke afbeelding worden opgenomen, waardoor deze aanzienlijk kleiner wordt.
- Scheiding van bouw- en uitvoeringsfasen: De duidelijke scheiding maakt het proces van bouwen en debuggen eenvoudiger te begrijpen. Je kunt fasen hebben voor het compileren van de broncode, het uitvoeren van tests, linting, en pas daarna de definitieve afbeelding maken met de gereedstaande applicatie.
- Verbetering van de beveiliging: De uiteindelijke afbeelding bevat slechts de minimaal benodigde componenten, wat het aanvalsvlak verkleint. Bouwtools en broncode, die kwetsbaarheden kunnen bevatten, worden niet opgenomen in de productie-afbeelding.
- Versnelling van de build (in sommige gevallen): Tussenliggende afbeeldingen kunnen worden gecachet, en bij wijzigingen alleen in de laatste fasen van de build hoeft niet alles vanaf nul opnieuw te worden opgebouwd.
- Vereenvoudiging van het buildproces: Het bouwen van de applicatie en het maken van de Docker-afbeelding worden één geautomatiseerd proces binnen één Dockerfile, wat CI/CD-pijplijnen vereenvoudigt.
Voorbeeld voor een Go-toepassing:
# Bouwfase
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
# Compilatie van het uitvoerbare bestand
RUN go build -ldflags="-s -w" -o myapp .
# Eindfase
FROM alpine:latest
WORKDIR /app
# Kopieer alleen het uitvoerbare bestand uit de vorige fase
COPY --from=builder /app/myapp .
# Commando om de toepassing te starten
CMD ["./myapp"]