Ich habe einige RUN
Befehle in meiner Docker-Datei, die ich -no-cache
jedes Mal ausführen möchte, wenn ich ein Docker-Image erstelle.
Ich verstehe, dass das docker build --no-cache
Caching für die gesamte Docker-Datei deaktiviert wird.
Ist es möglich, den Cache für einen bestimmten RUN-Befehl zu deaktivieren?
Antworten:
Es gibt immer die Möglichkeit, einen bedeutungslosen und kostengünstig auszuführenden Befehl vor der Region einzufügen, für die Sie den Cache deaktivieren möchten.
Wie in diesem Problemkommentar vorgeschlagen , kann ein Build-Argumentblock hinzugefügt werden (Name kann beliebig sein):
vor einem solchen Bereich, und ändern Sie seinen Wert bei jedem Lauf, indem Sie ihn
--build-arg CACHEBUST=$(date +%s)
alsdocker build
Argument hinzufügen (der Wert kann auch beliebig sein, hier ist es die aktuelle Datums- und Uhrzeitangabe, um seine Eindeutigkeit über die Läufe hinweg sicherzustellen).Dadurch wird natürlich auch der Cache für alle folgenden Blöcke deaktiviert, da die Hash-Summe des Zwischenbilds unterschiedlich ist. Dies macht das Deaktivieren des wirklich selektiven Caches zu einem nicht trivialen Problem, wenn man berücksichtigt, wie Docker derzeit funktioniert.
quelle
---> Using cache
unter meinem `` ARG CACHEBUST = 1 'Linie ... (und ja , ich habe zu tun--build-arg CACHEBUST=$(date +%s)
in meinem Docker - Befehl)RUN echo "$CACHEBUST"
da nur die VerwendungARG
den Cache nicht ungültig machtVerwenden
vor der RUN-Zeile möchten Sie immer ausführen. Dies funktioniert, da ADD immer die Datei / URL abruft und die obige URL bei jeder Anforderung zufällige Daten generiert. Docker vergleicht dann das Ergebnis, um festzustellen, ob der Cache verwendet werden kann.
Ich habe dies auch getestet und funktioniert gut, da es keine zusätzlichen Docker-Befehlszeilenargumente erfordert und auch aus einer Docker-compose.yaml-Datei funktioniert :)
quelle
Nicht direkt, aber Sie können Ihre Docker-Datei in mehrere Teile teilen, ein Image erstellen und dann aus diesem Bild am Anfang der nächsten Docker-Datei das Image mit oder ohne Caching erstellen
quelle
Ab Februar 2016 ist dies nicht möglich.
Die Funktion wurde bei GitHub angefordert
quelle
Die Funktion wurde vor einer Woche hinzugefügt.
https://github.com/moby/moby/issues/1996#issuecomment-550020843
quelle
Ich glaube, dass dies eine leichte Verbesserung gegenüber der obigen Antwort von @ steve ist:
Dies verwendet den Docker-Cache des Git-Klons, führt dann jedoch eine nicht zwischengespeicherte Aktualisierung des Repositorys aus.
Es scheint zu funktionieren und ist schneller - aber vielen Dank an @steve für die Bereitstellung der zugrunde liegenden Prinzipien.
quelle
Ein weiterer schneller Hack besteht darin, einige zufällige Bytes vor Ihrem Befehl zu schreiben
schreibt 5 zufällige Bytes aus, die einen Cache-Miss erzwingen
quelle