Build-Cache mit --cache-from und --cache-to verwalten
In diesem Schritt lernen Sie, wie Sie den Docker-Build-Cache mit den Flags --cache-from
und --cache-to
verwalten. Der Build-Cache kann nachfolgende Builds deutlich beschleunigen, indem er Schichten aus vorherigen Builds wiederverwendet. --cache-from
ermöglicht es Ihnen, ein Image als Cache-Quelle anzugeben, während --cache-to
den Build-Cache an einen bestimmten Ort (wie eine Registry oder ein lokales Verzeichnis) exportiert.
Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis ~/project
befinden.
cd ~/project
Lassen Sie uns unsere Dockerfile
leicht modifizieren, um eine Änderung zu simulieren, die normalerweise den Cache ungültig machen würde. Wir fügen eine einfache RUN
-Anweisung hinzu.
Öffnen Sie die Dockerfile
mit nano
:
nano Dockerfile
Fügen Sie nach der ARG
-Anweisung in der builder
-Stufe folgende Zeile hinzu:
RUN echo "Adding a new layer"
Die aktualisierte Dockerfile
sollte nun so aussehen:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding a new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
Speichern Sie die Dockerfile
und beenden Sie nano
.
Nun bauen wir das Image erneut, ohne spezifische Cache-Optionen zu verwenden. Docker wird automatisch den lokalen Cache nutzen, falls verfügbar.
docker build -t my-cached-image .
Sie sollten sehen, dass einige Schichten neu gebaut werden, da wir eine neue Anweisung hinzugefügt haben, die den Cache für nachfolgende Anweisungen ungültig macht.
Simulieren wir nun ein Szenario, in dem Sie ein zuvor gebautes Image als Cache-Quelle verwenden möchten, beispielsweise aus einer Registry oder einem anderen Build. Für die Demonstration verwenden wir das gerade gebaute my-cached-image
als Cache-Quelle für einen neuen Build.
Ändern wir zunächst die Dockerfile
erneut, um eine weitere Modifikation zu simulieren.
Öffnen Sie die Dockerfile
:
nano Dockerfile
Ändern Sie die Nachricht in der neuen RUN
-Anweisung:
RUN echo "Adding another new layer"
Die aktualisierte Dockerfile
sollte nun so aussehen:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
Speichern und beenden Sie nano
.
Bauen Sie das Image nun erneut, diesmal mit dem --cache-from
-Flag, um my-cached-image
als Cache-Quelle anzugeben.
docker build --cache-from my-cached-image -t my-cached-image-from .
Sie sollten beobachten, dass Docker versucht, Schichten aus my-cached-image
zu verwenden. Die Schicht der ersten RUN
-Anweisung wird wahrscheinlich neu gebaut, da sich die Anweisung geändert hat, aber nachfolgende Schichten könnten aus dem Cache geladen werden, wenn sie übereinstimmen.
Das --cache-to
-Flag wird verwendet, um den Build-Cache zu exportieren. Dies ist besonders in CI/CD-Pipelines nützlich, um Cache zwischen Builds zu teilen. Für --cache-to
benötigen Sie typischerweise einen Build-Treiber, der den Cache-Export unterstützt, wie den docker-container
-Treiber.
Installieren wir zunächst Docker Compose, das oft mit buildx verwendet wird.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Erstellen wir nun eine buildx-Builder-Instanz.
docker buildx create --use
Bauen wir nun das Image und exportieren den Cache in ein lokales Verzeichnis. Wir verwenden den local
-Cache-Exporter.
docker buildx build --cache-to type=local,dest=./build-cache -t my-exported-cache-image . --load
docker buildx build
: Verwendet das buildx-Tool für den Build.
--cache-to type=local,dest=./build-cache
: Exportiert den Cache in ein lokales Verzeichnis namens build-cache
im aktuellen Verzeichnis.
-t my-exported-cache-image
: Taggt das resultierende Image.
.
: Gibt den Build-Kontext (aktuelles Verzeichnis) an.
--load
: Lädt das gebaute Image in den lokalen Docker-Image-Cache.
Sie sollten eine Ausgabe sehen, die den Build und den Cache-Export anzeigt. Ein build-cache
-Verzeichnis wird in Ihrem ~/project
-Verzeichnis erstellt.
Simulieren wir nun eine saubere Build-Umgebung und versuchen, mit dem exportierten Cache zu bauen. Entfernen wir zunächst die gebauten Images.
docker rmi my-cached-image my-cached-image-from my-exported-cache-image
Bauen Sie das Image nun erneut, diesmal mit dem exportierten Cache als Quelle.
docker buildx build --cache-from type=local,src=./build-cache -t my-imported-cache-image . --load
--cache-from type=local,src=./build-cache
: Importiert den Cache aus dem lokalen Verzeichnis build-cache
.
Sie sollten beobachten, dass Docker die Schichten aus dem exportierten Cache verwendet, was den Build-Prozess im Vergleich zu einem Neubau deutlich beschleunigt.