it-swarm.com.de

Wie kann ich verhindern, dass eine Dockerfile-Anweisung zwischengespeichert wird?

In meiner Dockerfile benutze ich curl oder ADD, um die neueste Version eines Archivs herunterzuladen:

FROM debian:jessie
...
RUN apt-get install -y curl
...
RUN curl -sL http://example.com/latest/archive.tar.gz --output archive.tar.gz
...
ADD http://example.com/latest/archive2.tar.gz
...

Die RUN-Anweisung, die curl oder ADD verwendet, erstellt eine eigene Bildebene. Dieser wird als Cache für zukünftige Ausführungen von docker build verwendet.

Question: Wie kann ich die Zwischenspeicherung für diese Anweisungen deaktivieren?

Es wäre großartig, etwas wie cache invalidation dort arbeiten zu lassen. Z.B. mit HTTP ETags oder durch Abfragen des zuletzt geändert -Headerfelds. Dies würde die Möglichkeit geben, anhand der HTTP-Header eine schnelle Überprüfung durchzuführen, um zu entscheiden, ob eine zwischengespeicherte Ebene verwendet werden kann oder nicht.

Ich weiß, dass ein paar schmutzige Tricks helfen könnten, z. stattdessen ein Download-Shell-Skript in der RUN-Anweisung ausführen. Der Dateiname wird geändert, bevor der docker build von unserem Buildsystem ausgelöst wird. Und ich könnte die HTTP-Prüfungen in diesem Skript durchführen. Dann muss ich aber entweder das zuletzt verwendete ETag oder das zuletzt geändert in einer Datei speichern. Ich frage mich, ob es etwas sauberere und nativeDocker-Funktionalität gibt, die ich hier verwenden könnte.

22
h3nrik

Ein Build-Time-Argument kann angegeben werden, um den Cache ab diesem Schritt gewaltsam zu brechen. Zum Beispiel in Ihre Docker-Datei

ARG CACHE_DATE=not_a_date

und geben Sie diesem Argument dann bei jedem neuen Build einen neuen Wert. Am besten ist natürlich der Zeitstempel. 

docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...

Stellen Sie sicher, dass der Wert eine Zeichenfolge ohne Leerzeichen ist. Andernfalls wird er vom Docker-Client fälschlicherweise als mehrere Argumente verwendet. 

Ausführliche Informationen finden Sie in Problem 22832

21
Ruifeng Ma

docker build --no-cache würde den Cache für all die Befehle ungültig machen.

Dockerfile ADD-Befehl Verwendet, um den Cache ungültig zu machen. Obwohl es wurde verbessert in der aktuellen Docker-Version:

Docker soll eine durch ADD hinzugefügte Datei überprüfen und dann entscheiden, ob der Cache verwendet werden soll oder nicht.

Wenn sich also die hinzugefügte Datei geändert hat, sollte der Cache für den Befehl ADD ungültig gemacht werden.


Ausgabe 1326 erwähnt andere Tipps:

Das hat funktioniert.

RUN yum -y install firefox #redo

Es sieht also so aus, als würde Docker den Schritt (und alle Schritte darunter) erneut ausführen, wenn sich die Zeichenfolge, die ich an RUN übergeben habe, ohnehin ändert - es ist sogar nur ein Kommentar.

Der Docker-Cache wird nur verwendet, und nur wenn sich keiner seiner Vorfahren geändert hat (dieses Verhalten ist sinnvoll, da der nächste Befehl Änderungen zur vorherigen Ebene hinzufügt).

Der Cache wird verwendet, wenn sich kein Zeichen geändert hat (daher reicht selbst ein Speicherplatz aus, um einen Cache zu löschen).

26
VonC

Das Übergeben von Argumenten aus der Erstellungsdatei hat aus irgendeinem Grund bei mir nicht funktioniert. Ich löste meine, indem ich den Befehl anfügte, den ich nicht an den letzten CMD-Befehl cachen möchte.

Zum Beispiel:

CMD ["/bin/bash", "-c" , "python3 /foo.py && bash /bar.sh"]

Jetzt führe ich foo.py aus, das ich nicht zwischenspeichern möchte, dann bar.sh. Nicht sauber, aber es funktioniert.

0
Ahmed