Container ermöglichen es Ihnen, Ihre Anwendung portabel zu verpacken, die in vielen Umgebungen ausgeführt werden kann. Die beliebteste Containerplattform ist Docker.
Dieses Tutorial erklärt, wie Sie den Docker-Build-Cache zu Ihrem Vorteil nutzen können.
Docker-Build-Cache
Das Erstellen von Images sollte schnell, effizient und zuverlässig sein. Das Konzept der Docker-Images beinhaltet unveränderliche Ebenen. Jeder ausgeführte Befehl führt zu einer neuen Ebene, die die Änderungen gegenüber der vorherigen Ebene enthält.
Alle zuvor erstellten Layer werden zwischengespeichert und können wiederverwendet werden. Wenn Ihre Installation jedoch von externen Ressourcen abhängt, kann der Docker-Cache Probleme verursachen.
So nutzen Sie den Docker-Build-Cache
Um Probleme mit dem Docker-Build-Cache zu verstehen, erstellen wir eine einfache benutzerdefinierte nginx-Docker-Anwendung. Bevor Sie das Image erstellen, erstellen Sie eine Docker-Datei, die Bibliotheken aktualisiert und eine benutzerdefinierte Startseite hinzufügt:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>My Custom Startpage</body></html>' > /usr/share/nginx/html/index.html
Sie können jetzt das Docker-Image erstellen:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e12... 5.8s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.6s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.1s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
[+] Building 11.3s (7/7) FINISHED
In diesem Beispiel habe ich einige Ausgaben aus Gründen der Lesbarkeit entfernt. Wenn Sie das Image das erste Mal erstellen, sehen Sie, dass es ziemlich lange dauert, in meinem Fall 11.3s
.
Ein langer Ausführungsschritt ist apt-get update && apt-get -y upgrade
abhängig davon, wie viele Abhängigkeiten aktualisiert werden und wie schnell Ihre Internetgeschwindigkeit ist. Es sucht nach Paketaktualisierungen auf dem Betriebssystem und installiert sie, falls verfügbar.
Jetzt führen Sie es erneut aus und profitieren vom Docker-Build-Cache:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> CACHED [3/3] RUN echo '<html><bod>My Custom Startpage... 0.0s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.1s (7/7) FINISHED
Diesmal ist der Image-Build sehr schnell, da alle zuvor erstellten Images wiederverwendet werden können. Wenn Sie Ihre Startseite im Dockerfile anpassen, sehen Sie, wie das Caching-Verhalten beeinflusst wird:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
Erstellen Sie nun das Image erneut:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 2.1s (7/7) FINISHED
Diesmal hat es nur die letzte Ebene neu aufgebaut, weil es erkannt hat, dass der RUN
Befehl hatte sich geändert. Aber es hat den intensiven zweiten Build-Schritt wiederverwendet und die Betriebssystemabhängigkeiten nicht aktualisiert.
Das Caching-Verhalten ist intelligent. Sobald 1 Schritt neu erstellt werden muss, wird jeder nachfolgende Schritt erneut erstellt. Daher ist es gut, sich häufig ändernde Teile an das Ende eines Dockerfile
zu stellen frühere Build-Layer wiederzuverwenden.
Vielleicht möchten Sie jedoch eine Neuerstellung einer zwischengespeicherten Ebene erzwingen, um eine Paketaktualisierung zu erzwingen. Das Erzwingen einer Neuerstellung kann erforderlich sein, da Sie Ihre Anwendung sicher halten und die neuesten Updates verwenden möchten, sobald diese verfügbar sind.
So verwenden Sie Docker Build --no-cache
Möglichkeit
Es kann verschiedene Gründe geben, den Build-Cache zu deaktivieren. Sie können das Bild aus dem Basisbild neu erstellen, ohne zwischengespeicherte Ebenen zu verwenden, indem Sie --no-cache
verwenden Option.
$ docker build -t my-custom-nginx .
=> CACHED [1/3] FROM docker.io/library/nginx:1.21.6@sha256:... 0.0s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.5s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 5.5s (7/7) FINISHED
Neue Schichten wurden konstruiert und verwendet. Der docker build
führt dieses Mal beide Befehle aus, was mit einem Alles-oder-Nichts-Ansatz einhergeht. Entweder Sie geben den --no-cache
an Option, die alle Befehle ausführt, oder Sie werden so viel wie möglich zwischenspeichern.
So verwenden Sie Docker-Argumente für Cache-Busting
Eine weitere Option ermöglicht die Bereitstellung eines kleinen Startpunkts im Dockerfile. Sie müssen Ihr Dockerfile wie folgt bearbeiten:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Custom cache invalidation
ARG CACHEBUST=1
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
Sie fügen einen CACHEBUST
hinzu -Argument für Ihre Dockerfile an dem Ort, an dem Sie eine Neuerstellung erzwingen möchten. Jetzt können Sie das Docker-Image erstellen und einen immer anderen Wert angeben, der dazu führt, dass alle folgenden Befehle erneut ausgeführt werden:
$ docker build -t my-custom-nginx --build-arg CACHEBUST=$(date +%s) .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1... 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.3s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.0s (7/7) FINISHED
Durch Angabe von --build-arg CACHEBUST=$(date +%s)
, setzen Sie den Parameter auf einen immer anderen Wert, der bewirkt, dass alle folgenden Layer neu aufgebaut werden.