GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Docker-Cache – So führen Sie einen sauberen Image-Neuaufbau durch und löschen den Dockers-Cache

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.


Docker
  1. So verschieben Sie Docker-Images zwischen Hosts

  2. So exportieren und importieren Sie Docker-Container

  3. So verwenden Sie ein Dockerfile zum Erstellen eines Docker-Images

  4. So packen und übertragen Sie Docker-Images von einem Server auf einen anderen

  5. So ändern Sie Docker-Images

So installieren Sie KernelCare und löschen den Kernelcare-Cache unter Linux

So installieren und verwenden Sie Docker unter Ubuntu 22.04

So bereinigen und löschen Sie Docker-Images

So reduzieren Sie die Docker-Image-Größe in Docker-Containern

So verwenden Sie Docker:Bild speichern und zum Teilen exportieren

So erstellen Sie ein Docker-Image und übertragen es in das Docker-Hub-Repository