Basis van cloud en containers
FROM golang AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app .
FROM scratch
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]scratch is een leeg image dat geen enkel bestand bevat. Welke beschrijving van wat het uiteindelijke image bevat dat met het bovenstaande Dockerfile met een multi-stage build is gebouwd, is juist?
- AAlleen het uitvoerbare bestand /app dat in de stage build is gebouwd; de Go-compiler en de broncode zitten er niet in
- BDe lagen van de stage build en van de laatste stage worden allemaal gestapeld, dus de Go-compiler, de broncode en /app zitten er allemaal in
- CAlleen het golang-image van de eerste FROM en de broncode; /app wordt telkens gebouwd wanneer een container start
Antwoord en toelichting tonen
Antwoord: A. Alleen het uitvoerbare bestand /app dat in de stage build is gebouwd; de Go-compiler en de broncode zitten er niet in
Bij een multi-stage build begint elke FROM een stage, en alleen de laatste stage wordt het uiteindelijke image. De eerdere stages dienen om met hulpmiddelen zoals compilers artefacten te maken, en alleen de bestanden die in COPY --from worden genoemd, komen in de laatste stage terecht. Hier wordt alleen /app naar het lege image scratch gekopieerd; het resultaat is dus een klein image zonder de Go-compiler en zonder de broncode. Omdat scratch ook geen enkele gedeelde bibliotheek bevat, wordt CGO_ENABLED=0 gebruikt om een uitvoerbaar bestand te bouwen dat niet van andere bibliotheken afhangt. Minder inhoud betekent snellere pulls, minder hulpmiddelen voor aanvallers en minder doelwitten voor kwetsbaarheden.