Beim Erstellen von Docker-Images besteht die Notwendigkeit, Abhängigkeiten zwischenzuspeichern, um den Erstellungsprozess zu beschleunigen. Dieser Artikel befasst sich mit dem Problem, alle erforderlichen Module vorab zu erstellen und zwischenzuspeichern.
Ein Ansatz besteht darin, beim Erstellen des Images eine Ebene zum Zwischenspeichern von Abhängigkeiten hinzuzufügen. Dieser Schritt erfordert jedoch den Aufbau der Abhängigkeit, was zeitaufwändig sein kann. Eine alternative Methode ist die Verwendung des Befehls go build.
Eine andere Option besteht darin, alle in der Datei go.mod aufgeführten Abhängigkeiten vorab zu erstellen. Glücklicherweise stellt Docker eine Dokumentation bereit, die genau dieses Problem behebt. Der vorgeschlagene Ansatz besteht darin, die Docker-Datei wie folgt zu strukturieren:
FROM --platform=${BUILDPLATFORM} docker.io/golang:1.16.7-alpine AS build ARG TARGETOS ARG TARGETARCH WORKDIR /src ENV CGO_ENABLED=0 COPY go.* . RUN go mod download COPY . . RUN --mount=type=cache,target=/root/.cache/go-build \ GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /out/example . FROM scratch COPY --from=build /out/example /
Vereinfacht für eine einzelne Architektur sieht der relevante Caching-Aspekt wie folgt aus:
FROM docker.io/golang:1.16.7-alpine AS build WORKDIR /src COPY go.* . RUN go mod download COPY . . RUN --mount=type=cache,target=/root/.cache/go-build go build -o /out/example . FROM scratch COPY --from=build /out/example /
Dieser Mechanismus stellt einen Cache bereit Verzeichnis auf /root/.cache/go-build, das den Go-Build-Cache enthält. Während des ersten Builds wird der Cache gefüllt. Nachfolgende Builds nutzen die zwischengespeicherten Dateien.
Um diese Funktionalität zu aktivieren, schließen Sie DOCKER_BUILDKIT=1 ein, wenn Sie das Image mit dem Docker-Build-Befehl erstellen, oder verwenden Sie Docker Buildx. Tests haben die Wirksamkeit dieses Ansatzes bestätigt.
Das obige ist der detaillierte Inhalt vonWie kann man Abhängigkeiten in Docker-Images für Golang-Projekte effektiv zwischenspeichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!