Hoe gebruik je multi-stage build om Docker-afbeeldingen te optimaliseren?
sobes.tech AI
Antwoord van AI
De multi-stage build maakt het mogelijk om meerdere fasen (layers) te gebruiken in een Dockerfile, waarbij elke fase zijn eigen taak uitvoert. Het resultaat van één fase (bijvoorbeeld een gecompileerd artefact) wordt doorgegeven aan de volgende fase, maar de tussenlagen van eerdere fasen worden niet opgenomen in het uiteindelijke beeld.
Voorbeeld van gebruik voor het bouwen van een Go-toepassing:
# Bouwfase
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Finale fase
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Voordelen:
- Vermindering van de grootte van het beeld: In het uiteindelijke beeld bevindt zich alleen de gebuildde applicatie en de benodigde afhankelijkheden, niet de bouwtools, broncode of tussenbestanden.
- Scheiding van verantwoordelijkheden: De logica van compilatie/implementatie wordt gescheiden van de implementatielogica.
- Verhoogde veiligheid: De aanvalsvlak wordt verkleind door onnodige tools en bibliotheken uit het uiteindelijke beeld te verwijderen.
- Versnelling van de bouw: Het cachen van lagen tussen fasen kan herhaalde builds versnellen.
In het gegeven Dockerfile wordt de eerste laag builder gebruikt om de Go-toepassing te compileren. De tweede laag, die begint met FROM alpine:latest, kopieert alleen de gecompileerde toepassing van de eerste laag (COPY --from=builder /app/myapp /app/) naar een schoon basisbeeld. Het uiteindelijke beeld bevat alleen het uitvoerbare bestand en het basisbesturingssysteem, zonder Go-compiler en broncode.
Dit vermindert de grootte van het beeld aanzienlijk in vergelijking met de traditionele aanpak, waarbij compilatie en uitvoering plaatsvinden in één container.