Wie man den docker builder prune-Befehl verwendet, um Build-Caches zu entfernen

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie den Docker-Build-Cache effektiv mit dem Befehl docker builder prune verwalten können. Wir beginnen damit, ein einfaches Docker-Image zu erstellen, um zu verstehen, wie der Build-Cache erstellt und genutzt wird, um nachfolgende Builds zu beschleunigen.

Nachdem das Image erstellt wurde, werden Sie verschiedene Methoden zur Bereinigung des Build-Caches erkunden. Dies umfasst das Entfernen von hängenden Build-Caches, das Entfernen aller ungenutzten Build-Caches und die Verwendung von Filtern, um gezielt Caches zu bereinigen. Abschließend lernen Sie, wie Sie den Build-Cache bereinigen können, während Sie gleichzeitig Speicherplatz sparen. So erhalten Sie ein umfassendes Verständnis der Techniken zur Build-Cache-Verwaltung.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/pull -.-> lab-555043{{"Wie man den docker builder prune-Befehl verwendet, um Build-Caches zu entfernen"}} docker/images -.-> lab-555043{{"Wie man den docker builder prune-Befehl verwendet, um Build-Caches zu entfernen"}} docker/prune -.-> lab-555043{{"Wie man den docker builder prune-Befehl verwendet, um Build-Caches zu entfernen"}} docker/build -.-> lab-555043{{"Wie man den docker builder prune-Befehl verwendet, um Build-Caches zu entfernen"}} end

Erstellen eines Images zur Erzeugung von Build-Cache

In diesem Schritt werden wir ein einfaches Docker-Image erstellen, um zu verstehen, wie der Build-Cache erzeugt wird. Docker nutzt einen Build-Cache, um nachfolgende Builds zu beschleunigen. Jede Anweisung in einer Dockerfile erzeugt eine Ebene (Layer), und wenn die Anweisung seit dem letzten Build nicht geändert wurde, kann Docker die vorhandene Ebene aus dem Cache wiederverwenden.

Zunächst navigieren Sie in das Verzeichnis ~/project, falls Sie nicht bereits dort sind.

cd ~/project

Jetzt erstellen wir eine einfache Dockerfile. Wir werden sie Dockerfile.cache nennen.

nano Dockerfile.cache

Fügen Sie den folgenden Inhalt zur Datei Dockerfile.cache hinzu:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl
COPY . /app
WORKDIR /app
CMD ["curl", "https://www.example.com"]

Speichern Sie die Datei und verlassen Sie den nano-Editor (Drücken Sie Ctrl + X, dann Y, dann Enter).

Diese Dockerfile macht Folgendes:

  • FROM ubuntu:latest: Beginnt mit dem neuesten Ubuntu-Basisimage.
  • RUN apt-get update && apt-get install -y --no-install-recommends curl: Aktualisiert die Paketliste und installiert das curl-Paket. Dies ist eine häufige Operation und wird wahrscheinlich bei nachfolgenden Builds gecacht, wenn das Basisimage und diese Anweisung nicht geändert werden.
  • COPY . /app: Kopiert den Inhalt des aktuellen Verzeichnisses in das Verzeichnis /app im Image.
  • WORKDIR /app: Setzt das Arbeitsverzeichnis auf /app.
  • CMD ["curl", "https://www.example.com"]: Gibt den Befehl an, der ausgeführt wird, wenn ein Container aus diesem Image gestartet wird.

Bevor wir das Image erstellen, stellen wir sicher, dass wir das ubuntu:latest-Image lokal haben. Wenn nicht, wird Docker es während des Builds automatisch herunterladen, aber das explizite Herunterladen kann manchmal die Build-Ausgabe klarer machen.

docker pull ubuntu:latest

Jetzt erstellen wir das Image mit der Dockerfile.cache-Datei. Wir werden das Image mit dem Tag myimage:cachetest versehen.

docker build -t myimage:cachetest -f Dockerfile.cache .

Sie werden eine Ausgabe sehen, die die Schritte des Build-Prozesses anzeigt. Docker wird jede Anweisung in der Dockerfile ausführen. Da dies das erste Mal ist, dass Sie mit dieser Dockerfile bauen, wird Docker keinen Build-Cache für die in dieser Dockerfile definierten Ebenen verwenden.

Nachdem der Build abgeschlossen ist, können Sie Ihre Images auflisten, um das neu erstellte myimage:cachetest zu sehen.

docker images

Sie sollten myimage mit dem Tag cachetest in der Liste sehen. Dieser Build-Prozess hat für jede in der Dockerfile.cache definierte Ebene einen Build-Cache erzeugt. In den nächsten Schritten werden wir untersuchen, wie wir diesen Build-Cache verwalten können.

Entfernen von hängenden Build-Caches

In diesem Schritt lernen wir, wie man hängende Build-Caches entfernt. Hängende Build-Caches bezeichnen Build-Cache-Ebenen (Layers), die nicht mehr mit einem benannten Image verknüpft sind. Dies kann passieren, wenn Sie ein Image neu erstellen und eine vorherige Ebene durch eine neue ersetzt wird. Das Entfernen von hängenden Caches kann helfen, Plattenplatz freizugeben.

Zunächst ändern wir unsere Dockerfile.cache etwas, um einige hängende Caches zu erzeugen. Wir ändern die RUN-Anweisung.

Navigieren Sie in das Verzeichnis ~/project, falls Sie nicht bereits dort sind.

cd ~/project

Öffnen Sie die Datei Dockerfile.cache zum Bearbeiten.

nano Dockerfile.cache

Ändern Sie die RUN-Anweisung von:

RUN apt-get update && apt-get install -y --no-install-recommends curl

in:

RUN apt-get update && apt-get install -y --no-install-recommends wget

Speichern Sie die Datei und verlassen Sie den nano-Editor (Drücken Sie Ctrl + X, dann Y, dann Enter).

Jetzt erstellen wir das Image erneut mit demselben Tag.

docker build -t myimage:cachetest -f Dockerfile.cache .

Beobachten Sie die Ausgabe. Docker wird wahrscheinlich die FROM-Ebene aus dem Cache wiederverwenden, aber die RUN-Anweisung hat sich geändert, daher wird es diesen Schritt erneut ausführen und eine neue Ebene erstellen. Die vorherige Ebene, die von der alten RUN-Anweisung erstellt wurde, ist jetzt ein hängender Build-Cache, da sie nicht mehr Teil des myimage:cachetest-Images ist.

Um den Build-Cache anzuzeigen, können Sie den Befehl docker builder prune --dry-run verwenden, obwohl es ohne fortschrittliche Tools oder ein Verständnis der Buildkit-Ausgabe nicht immer einfach ist, hängende Caches speziell zu unterscheiden. Ein einfacherer Weg, die Wirkung zu sehen, ist es, die hängenden Caches zu entfernen und den wiedergewonnenen Speicherplatz zu beobachten.

Um nur die hängenden Build-Caches zu entfernen, verwenden wir den Befehl docker builder prune mit der Option --filter dangling=true.

docker builder prune --filter dangling=true

Sie werden aufgefordert, die Aktion zu bestätigen. Geben Sie y ein und drücken Sie Enter.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

Die Ausgabe zeigt die Menge an wiedergewonnenem Speicherplatz. Dieser Speicherplatz wurde von den hängenden Build-Cache-Ebenen belegt, die nicht mehr benötigt wurden.

Durch das Entfernen von hängenden Build-Caches können Sie Plattenplatz wiedergewinnen, der von keinen aktiven Image-Ebenen mehr genutzt wird.

Entfernen aller ungenutzten Build-Caches

In diesem Schritt lernen wir, wie man alle ungenutzten Build-Caches entfernt. Während das Entfernen von hängenden Caches Ebenen (Layers) entfernt, die nicht mit einem Image verknüpft sind, entfernt das Entfernen aller ungenutzten Caches alle Build-Caches, die derzeit von keinem laufenden Container genutzt oder von einem lokalen Image referenziert werden. Dies ist eine aggressivere Methode, um Plattenplatz freizugeben.

Zunächst erstellen wir ein weiteres Image mit einer anderen Dockerfile, um mehr Build-Cache hinzuzufügen.

Navigieren Sie in das Verzeichnis ~/project, falls Sie nicht bereits dort sind.

cd ~/project

Erstellen Sie eine neue Dockerfile namens Dockerfile.another.

nano Dockerfile.another

Fügen Sie den folgenden Inhalt in Dockerfile.another ein:

FROM alpine:latest
RUN apk update && apk add --no-cache git
COPY . /app2
WORKDIR /app2
CMD ["git", "--version"]

Speichern Sie die Datei und verlassen Sie den nano-Editor (Drücken Sie Ctrl + X, dann Y, dann Enter).

Diese Dockerfile nutzt das alpine-Basisimage und installiert git.

Jetzt erstellen wir ein Image mit dieser neuen Dockerfile. Wir werden es mit dem Tag anotherimage:latest versehen.

docker build -t anotherimage:latest -f Dockerfile.another .

Dieser Build wird neue Build-Cache-Ebenen speziell für diese Dockerfile erstellen.

Um alle ungenutzten Build-Caches zu entfernen, verwenden wir den Befehl docker builder prune ohne Filter.

docker builder prune -a

Das -a-Flag steht für "all" (alle) und gibt an, dass Sie alle ungenutzten Build-Caches entfernen möchten, nicht nur hängende Caches.

Sie werden aufgefordert, die Aktion zu bestätigen. Geben Sie y ein und drücken Sie Enter.

WARNING! This will remove all unused build cache.
Are you sure you want to continue? [y/N] y

Die Ausgabe zeigt die Menge an wiedergewonnenem Speicherplatz. Dieser Befehl entfernt alle Build-Cache-Ebenen, die derzeit von keinem lokalen Image oder laufenden Container referenziert werden. Dies kann einen beträchtlichen Plattenplatz freigeben, insbesondere nach vielen Builds und Image-Updates.

Beachten Sie, dass das Entfernen aller ungenutzten Caches möglicherweise bedeutet, dass nachfolgende Builds von Images, die Sie noch lokal haben, länger dauern, wenn sie auf die entfernten Cache-Ebenen angewiesen waren.

Entfernen von Build-Caches mit Filtern

In diesem Schritt werden wir untersuchen, wie man Build-Caches mithilfe von Filtern entfernt. Filter ermöglichen es Ihnen, Build-Caches gezielt basierend auf bestimmten Kriterien zu entfernen, sodass Sie eine feinere Kontrolle darüber haben, was entfernt wird.

Wir haben bereits den Filter dangling=true in einem vorherigen Schritt kennengelernt. Ein weiterer nützlicher Filter ist until, der es Ihnen ermöglicht, Build-Caches zu entfernen, die vor einem bestimmten Zeitstempel erstellt wurden.

Zunächst erstellen wir erneut unser myimage:cachetest-Image, um sicherzustellen, dass wir aktuelle Build-Caches haben.

Navigieren Sie in das Verzeichnis ~/project, falls Sie nicht bereits dort sind.

cd ~/project

Erstellen Sie das Image erneut:

docker build -t myimage:cachetest -f Dockerfile.cache .

Jetzt simulieren wir ein Szenario, in dem Sie Build-Caches entfernen möchten, die älter als eine bestimmte Zeit sind. Zu Demonstrationszwecken verwenden wir einen Filter, um Caches zu entfernen, die älter als einige Minuten sind.

Um Build-Caches, die älter als eine bestimmte Zeit sind, zu entfernen, können Sie die Option --filter until=<timestamp> verwenden. Der Zeitstempel kann in verschiedenen Formaten vorliegen, einschließlich einer Dauer wie 5m (5 Minuten) oder 2h (2 Stunden).

Lassen Sie uns Build-Caches entfernen, die älter als 5 Minuten sind.

docker builder prune --filter until=5m

Sie werden aufgefordert, die Aktion zu bestätigen. Geben Sie y ein und drücken Sie Enter.

WARNING! This will remove all build cache created before 5 minutes ago.
Are you sure you want to continue? [y/N] y

Die Ausgabe zeigt die Menge an wiedergewonnenem Speicherplatz aus Build-Caches, die älter als 5 Minuten waren. Wenn Sie das Image gerade erstellt haben, gibt es möglicherweise nicht viele Caches, die älter als 5 Minuten sind. In einem realen Szenario mit vielen Builds im Laufe der Zeit kann dieser Filter jedoch sehr nützlich sein, um alte Caches aufzuräumen.

Sie können auch Filter kombinieren. Beispielsweise können Sie, um hängende Caches, die älter als eine bestimmte Zeit sind, zu entfernen, Folgendes verwenden:

docker builder prune --filter dangling=true --filter until=24h

Dies würde nur die hängenden Build-Caches entfernen, die älter als 24 Stunden sind.

Die Verwendung von Filtern bietet Flexibilität bei der Verwaltung Ihrer Build-Caches und hilft Ihnen, Plattenplatz strategischer freizugeben.

Entfernen von Build-Caches unter Beibehaltung eines bestimmten Speicherplatzes

In diesem Schritt lernen wir, wie man Build-Caches entfernt, während ein bestimmter Speicherplatz beibehalten wird. Dies ist nützlich, wenn Sie Plattenplatz freigeben möchten, aber trotzdem einige aktuelle Build-Caches behalten möchten, um zukünftige Builds zu beschleunigen.

Der Befehl docker builder prune hat die Option --keep-storage, mit der Sie die maximale Speichermenge angeben können, die für Build-Caches beibehalten werden soll. Sie können die Größe in Bytes angeben oder Einheiten wie k, m oder g verwenden.

Zunächst stellen wir sicher, dass wir einige Build-Caches haben, die wir entfernen können. Wir haben in vorherigen Schritten Images erstellt, was Caches erzeugt hat.

Navigieren Sie in das Verzeichnis ~/project, falls Sie nicht bereits dort sind.

cd ~/project

Um Build-Caches zu entfernen, während eine bestimmte Speichermenge beibehalten wird, verwenden Sie die Option --keep-storage gefolgt von der gewünschten Größe. Beispielsweise um maximal 1 GB Build-Cache zu behalten:

docker builder prune --keep-storage 1g

Sie werden aufgefordert, die Aktion zu bestätigen. Geben Sie y ein und drücken Sie Enter.

WARNING! This will remove all build cache exceeding 1GB.
Are you sure you want to continue? [y/N] y

Die Ausgabe zeigt die Menge an wiedergewonnenem Speicherplatz. Docker wird die ältesten Build-Cache-Ebenen entfernen, bis die Gesamtgröße des Build-Caches unter der angegebenen --keep-storage-Grenze liegt.

Sie können den Wert von --keep-storage anpassen, basierend auf Ihrem verfügbaren Plattenplatz und wie viel Cache Sie für schnellere Builds behalten möchten. Beispielsweise um maximal 500 MB zu behalten:

docker builder prune --keep-storage 500m

Bestätigen Sie erneut die Aktion, indem Sie y eingeben und Enter drücken.

Diese Methode bietet ein Gleichgewicht zwischen der Freigabe von Plattenplatz und der Aufrechterhaltung eines gewissen Build-Caches für eine bessere Leistung. Es ist eine gute Praxis, Ihre Build-Caches regelmäßig zu bereinigen, um zu verhindern, dass sie zu viel Plattenplatz verbrauchen.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man den Befehl docker builder prune verwendet, um den Docker-Build-Cache zu verwalten. Wir haben begonnen, indem wir ein einfaches Docker-Image mithilfe einer Dockerfile erstellt haben, um zu verstehen, wie der Build-Cache erstellt wird und wie Docker ihn nutzt, um nachfolgende Builds zu beschleunigen. Jede Anweisung in der Dockerfile erstellt eine Ebene, und Docker verwendet vorhandene Ebenen aus dem Cache erneut, wenn die Anweisung sich nicht geändert hat.

Anschließend haben wir verschiedene Methoden zur Entfernung des Build-Caches untersucht. Wir haben gelernt, wie man hängende Build-Caches entfernt, das sind Cache-Einträge, die nicht mehr mit einem Build verknüpft sind. Wir haben auch behandelt, wie man alle unbenutzten Build-Caches entfernt, wodurch effektiv alle Cache-Einträge aufgeräumt werden, die derzeit von keinem Image verwendet werden. Darüber hinaus haben wir gezeigt, wie man Filter mit dem prune-Befehl verwendet, um Build-Caches gezielt basierend auf bestimmten Kriterien zu entfernen. Schließlich haben wir die Option untersucht, Build-Caches zu entfernen, während der Speicher, der mit bestimmten Cache-Einträgen verknüpft ist, beibehalten wird. Dies kann in bestimmten Szenarien nützlich sein.