Grundlagen von Cloud und Containern
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 ist ein leeres Image, das keinerlei Dateien enthält. Was enthält das endgültige Image, das mit dem obigen Dockerfile mit Multi-Stage-Build gebaut wird?
- ANur die in der Stage build erzeugte ausführbare Datei /app; der Go-Compiler und der Quellcode sind nicht enthalten
- BDie Schichten der Stage build und der letzten Stage liegen alle übereinander, sodass Go-Compiler, Quellcode und /app enthalten sind
- CNur das golang-Image des ersten FROM und der Quellcode; /app wird bei jedem Start eines Containers gebaut
Antwort und Erläuterung anzeigen
Antwort: A. Nur die in der Stage build erzeugte ausführbare Datei /app; der Go-Compiler und der Quellcode sind nicht enthalten
Bei einem Multi-Stage-Build beginnt mit jedem FROM eine neue Stage, und nur die letzte Stage wird zum endgültigen Image. Frühere Stages dienen dazu, mit Werkzeugen wie Compilern Artefakte zu erzeugen, und nur die in COPY --from genannten Dateien gelangen in die letzte Stage. Hier wird nur /app auf das leere scratch kopiert, sodass ein kleines Image ohne Go-Compiler und Quellcode entsteht. Da in scratch auch keine einzige Shared Library vorhanden ist, wird mit CGO_ENABLED=0 eine ausführbare Datei gebaut, die von keinen anderen Bibliotheken abhängt. Weniger Inhalt bedeutet schnelleres Holen sowie weniger Werkzeuge für Angreifer und weniger Angriffsfläche für Schwachstellen.
Weiter: 9 weitere Fragen zu Grundlagen von Cloud und Containern