Während des Wochenendes habe ich etwas über Docker-Images recherchiert, die speziell für die Verwendung mit Go-Anwendungen (Golang) gedacht sind. Daher habe ich darüber nachgedacht, die interessanten Erkenntnisse zu teilen, da dies für jemanden nützlich sein könnte, der dasselbe für seine technischen Projektarbeiten erforscht.
Hier werde ich einige verschiedene Möglichkeiten erläutern, wie wir ein Image für Golang erstellen können, und auch einige der Sicherheitsaspekte hervorheben, die wir bei der Auswahl berücksichtigen müssen.
Für diese Übung habe ich eine einfache Rest-API verwendet, die mit Go (Golang) und dem Gin Framework entwickelt wurde.
Das Gin-Framework ist ein beliebtes Web-Framework für Go (Golang), das schnell, einfach zu verwenden und hocheffizient ist.
Hier ist eine kurze Zusammenfassung der wichtigsten Merkmale und Eigenschaften;
Hauptfunktionen
Leistung: Gin ist für seine hohe Leistung bekannt. Es ist eines der schnellsten Go-Web-Frameworks und bietet im Vergleich zu anderen Frameworks einen minimalen Overhead.
Schneller HTTP-Router: Gin verwendet einen schnellen HTTP-Router und unterstützt Routing mit Methoden wie GET, POST, PUT, DELETE usw. Es unterstützt auch Middleware und Routengruppierung.
Middleware-Unterstützung: Gin bietet eine Möglichkeit, Middleware zu verwenden, um Aufgaben wie Protokollierung, Authentifizierung und andere Vor- oder Nachbearbeitungen von Anfragen abzuwickeln.
JSON-Validierung: Das Framework bietet integrierte Unterstützung für die JSON-Validierung und die Bindung von Anforderungsdaten an Go-Strukturen, was die Arbeit mit JSON-Nutzlasten erleichtert.
Fehlerbehandlung: Gin verfügt über eine strukturierte Art der Fehlerbehandlung und stellt ein zentrales Fehlermanagementsystem bereit, das Ihnen einen reibungslosen Umgang mit Fehlern ermöglicht.
Vorlagen-Rendering: Während Gin in erster Linie für die API-Entwicklung konzipiert ist, unterstützt es bei Bedarf das Rendern von HTML-Vorlagen.
Anfragebearbeitung: Unterstützt verschiedene Methoden zur Anfragebearbeitung, einschließlich Formulardaten, JSON-Nutzlasten und URL-Parameter.
Integriertes Debugging: Gin stellt detaillierte Fehlermeldungen und Debugging-Informationen bereit, die während der Entwicklung nützlich sein können.
Router: Die Kernkomponente, die die Weiterleitung von HTTP-Anfragen an die entsprechenden Handler übernimmt.
Kontext: Eine Struktur, die die Anforderungs- und Antwortdaten trägt, und
stellt Methoden zur Verfügung, um damit umzugehen. Es wird häufig in Handlern verwendet.
Engine: Die primäre Instanz der Gin-Anwendung, die mit Routen, Middleware und anderen Einstellungen konfiguriert ist.
Middleware: Funktionen, die während des Anforderungslebenszyklus ausgeführt werden und es Ihnen ermöglichen, Aufgaben wie Protokollierung, Authentifizierung und mehr auszuführen
Genug vom Gin Framework :) Kommen wir nun zum Hauptthema und sprechen über die durchgeführten Tests.
In diesem Test verwenden wir ein offizielles Standard-/Regulär-Go-Basisbild
# Official Go Base Image FROM golang:1.21.0 # Create The Application Working Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy Source and Build The Application COPY . . RUN go build -o main . # Expose The Port EXPOSE 8081 CMD ["./main"]
Bildgröße
In diesem Test verwenden wir die Alpine-Version des Go Base Image, die etwas leichter ist
# Official Go Apline Base Image FROM golang:1.21.0-alpine as builder # Create The Application Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy The Application Source & Build COPY . . RUN go build -o main . # Final Image Creation Stage FROM alpine:3.19 WORKDIR /root/ # Copy The Built Binary COPY --from=builder /app/main . # Expose the port EXPOSE 8081 CMD ["./main"]
Bildgröße
Hier sieht man, dass bei einem mehrstufigen Aufbau die Bildgrößen deutlich reduziert werden.
In diesem Test verwenden wir ein Distroless Go-Basisbild von Google. Distroless-Images sind dafür bekannt, dass sie leichtgewichtig und sicher sind und nur die minimal erforderlichen Dateien enthalten. Dabei wurden diese Debug-Shells und unnötigen Pakete entfernt. Daher opfern Sie die Flexibilität eines Paketmanagers und einer Shell.
# Build Stage FROM golang:1.21.0 as builder # Set The Application Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy The Application Source and Build the application COPY . . RUN CGO_ENABLED=0 go build -o main . # Final Image Creation Stage FROM gcr.io/distroless/static-debian12 # Copy the built binary COPY --from=builder /app/main / CMD ["/main"]
Bildgröße
CGO_ENABLED=0: Dies ist eine Umgebungsvariableneinstellung, die CGO (C-Go) deaktiviert. CGO ist eine Funktion von Go, die es Go-Paketen ermöglicht, C-Code aufzurufen. Durch das Festlegen von CGO_ENABLED=0 wird sichergestellt, dass der Build nicht von C-Bibliotheken abhängt und eine vollständig statische Binärdatei erstellt wird. Dies ist nützlich, um leichte und portable Go-Binärdateien zu erstellen, die auf jedem System ausgeführt werden können, ohne dass zusätzliche Abhängigkeiten erforderlich sind.
Alles zusammenfassend bedeutet RUN CGO_ENABLED=0 go build -o main ., dass Docker einen Befehl zum Erstellen einer Go-Anwendung im aktuellen Verzeichnis ausführt und dabei eine statische Binärdatei mit dem Namen „main“ erzeugt, die dies nicht tut hängen von allen C-Bibliotheken ab.
Bildgröße
Auch wenn die Distroless-Bilder etwas größer sind als die Alpine-Bilder, könnte die Überlegung zu Sicherheitsbedrohungen/Schwachstellen dazu führen, sich für Distroless! zu entscheiden. Denken Sie daher über all diese Fakten nach und wählen Sie diejenige aus, die Ihren Anforderungen entspricht
Alpine mit mehrstufigen Builds ist eine gute Wahl, wenn Sie mehr Kontrolle über den Build-Prozess benötigen und keine Kompatibilitätsprobleme mit musl libc bestehen ein Anliegen. Es bietet Flexibilität und ist kleiner als viele andere Basis-Images, enthält aber dennoch mehr Komponenten als Distroless-Images, was zu potenziellen Sicherheitslücken/-bedrohungen führen kann.
Google Distroless Images sind ideal, um die Sicherheit zu maximieren und die Angriffsfläche zu minimieren. Sie bieten eine sehr minimale Laufzeitumgebung, was für Produktionssysteme von Vorteil sein kann, bei denen Sicherheit Priorität hat. Sie opfern jedoch die Flexibilität eines Paketmanagers und einer Shell.
Verwenden Sie Alpine, wenn Sie Flexibilität und Kontrolle über die Build-Umgebung benötigen und wenn Kompatibilitätsprobleme mit musl libc kein Problem darstellen.
Verwenden Sie Google Distroless, wenn Sicherheit und die Minimierung der Angriffsfläche für Sie oberste Priorität haben und Sie sicherstellen können, dass alle Abhängigkeiten Ihrer Anwendung ordnungsgemäß gebündelt sind.
Ich hoffe, das war interessant und danke für deine Zeit!
Das obige ist der detaillierte Inhalt vonDocker-Images für Go (Golang) Kleine, schnellere Docker-Images und Sicherheit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!