Blog

Schnellere Docker-Builds mit dem Cache von Azure Container Registry

Timo Uelen

Timo Uelen

Aktualisiert Oktober 15, 2025
4 Minuten

Bei der Erstellung von Docker-Images wiederholen wir häufig Schritte. Bei der lokalen Erstellung verwendet Docker einen Cache, so dass es die bereits erstellten Schichten nicht erneut erstellen muss. Das ist großartig!

In CI/CD-Pipelines beginnen Sie oft mit einer sauberen virtuellen Maschine. Das bedeutet, dass es noch keinen Docker-Cache gibt! Ihr Docker-Image wird jedes Mal von Grund auf neu erstellt. Das kostet wertvolle Zeit und führt zu einer langsameren Feedbackschleife.

Wir können dies optimieren, indem wir ein vorhandenes Bild als Cache verwenden!

In diesem Blogpost verwenden wir die Azure Container Registry als Registry. Wenn Sie eine andere Container-Registry verwenden, gilt das Prinzip trotzdem.

Eine Docker Build- und Push-CI/CD-Pipeline

Warum Abziehen vor dem Bauen eine schlechte Idee ist

Wenn Sie Ihr Bild ziehen, bevor Sie es erstellen, müssen Sie immer Ihr gesamtes Bild ziehen. Stellen Sie sich vor, wir ändern eine Schicht unseres Images. Docker muss das Image von dieser Schicht an neu erstellen. Eine Änderung in einer Schicht wirkt sich auf alle nachfolgenden Schichten aus! Das bedeutet, dass wir immer mehr Schichten ziehen, als wir eigentlich brauchen!

Abziehen vor dem Bauen kann wertvolle Zeit kosten

Wir können etwas Besseres tun, als unser gesamtes Image zu ziehen. Sagen wir Docker, dass es nach Schichten aus einer entfernten Registrierung suchen soll.

Erstellen Sie Ihr Image mit einem Remote-Cache

Wenn wir docker build ausführen, können wir --cache-from <image> angeben. Dadurch wird Docker angewiesen, die Ebenen von <image> als Cache zu verwenden. Dies kann ein beliebiges Bild sein, aber normalerweise ist es eine frühere Version des Bildes, das wir erstellen. Der Prozess sieht dann wie folgt aus:

Ziehen Sie nur die Ebenen aus ACR, die wir benötigen

docker build . -t myregistry.azurecr.io/myimage:latest --cache-from myregistry.azurecr.io/myimage:latest

Beim ersten Mal, wenn wir es erstellen, zeigt Docker eine Fehlermeldung an, dass es dieses Image nicht finden kann:

ERROR importing cache manifest from myregistry.azurecr.io/myimage:latest

Dieser Fehler wird ignoriert und der Build wird trotzdem fortgesetzt. Sobald wir in unsere Registry pushen und erneut bauen, ist der Fehler behoben.

Lassen Sie uns das Bild pushen, damit es als Cache verfügbar ist:

Ihr Image aufpolieren

Um Ihr Image in Ihre Registrierung zu übertragen, führen Sie aus:

docker push myregistry.azurecr.io/myimage:latest

Erstellen Sie Ihr Bild erneut, jetzt unter Verwendung des Caches

Lassen Sie uns das Bild erneut erstellen, damit wir sehen können, wie unser Cache verwendet wird.

Hinweis: Wenn Sie dies lokal testen, stellen Sie sicher, dass Sie Ihr Image und seine Caches entfernen. Andernfalls wird Docker den lokalen Cache anstelle des Caches aus der Registry verwenden! Um dies zu tun : 1. Entfernen Sie Ihr Image mit docker rmi myregistry.azurecr.io/myimage:latest 2. Entfernen Sie den Build-Cache: docker builder prune

Wir verwenden denselben Build-Befehl:

docker build . -t myregistry.azurecr.io/myimage:latest --cache-from myregistry.azurecr.io/myimage:latest

Dieses Mal verwendet Docker den Cache aus der Registry. Der Build wird viel schneller sein und Sie können in der Ausgabe deutlich sehen, dass der Cache verwendet wird:

CACHED
CACHED
CACHED
...

Aber halt! Ich sehe CACHED nicht in meiner Ausgabe. Es sieht so aus, als würde Docker wieder alles bauen! Was ist hier los?!

--cache-from zieht keine Schichten

Ich verwende einen Cache, warum baut Docker alles neu auf?!

Standardmäßig enthält unser Docker-Image in unserer Registry keine Cache-Informationen, kann also nicht als Cache verwendet werden!

Wir können dies beheben, indem wir Docker anweisen, die Cache-Informationen in unser Image aufzunehmen. Fügen Sie --cache-to type=inline zu Ihrem Build-Befehl hinzu:

docker build . -t myregistry.azurecr.io/myimage:latest --cache-from myregistry.azurecr.io/myimage:latest --cache-to type=inline

Unser Bild enthält jetzt Cache-Informationen!

Lassen Sie uns unser Bild erneut in die Registrierung übertragen:

docker push myregistry.azurecr.io/myimage:latest

Neu erstellen, um den Cache zu verwenden

Wir erstellen unser Image erneut mit demselben Befehl wie zuvor. Wir können jetzt sehen, dass Docker den Cache richtig nutzt und bereits vorhandene Schichten abruft!

=> CACHED [1/7]
=> CACHED [2/7]
=> CACHED [3/7]
...

Fazit

Die Verwendung eines Remote-Image-Caches kann Ihre Docker-Builds erheblich beschleunigen. Vergessen Sie nicht, --cache-to type=inline in Ihrem Build-Befehl zu verwenden! Sonst müssten Sie Ihre Images jedes Mal von Grund auf neu erstellen.


Foto von Ines A. auf Unsplash

Verfasst von

Timo Uelen

Timo Uelen is a Machine Learning Engineer at Xebia.

Contact

Let’s discuss how we can support your journey.