Ich bin mit Docker auf CircleCI und ich habe Probleme beim Caching-COPY-Befehle.
Der Kreis CI docs erwähnen bekannt Caching-Probleme und empfehlen a href mit <= "https : //git.wiki.kernel.org/index.php/ExampleScripts#Setting_the_timestamps_of_the_files_to_the_commit_timestamp_of_the_commit_which_last_touched_them "> dieser perl-Skript die Zeitstempel auf dem Dateicache zu erhalten, kopiert setzen über.
Docker best practice docs Zustand:
Bei den Anweisungen ADD und COPY wird der Inhalt der Datei (en), die in das Bild eingefügt werden, werden untersucht. Insbesondere a es wird eine Prüfsumme der Datei (en) erstellt und dann wird diese Prüfsumme verwendet die Cache-Suche.
Gemäß den CircleCi-Empfehlungen speichere ich den Cache auf der Festplatte und lade ihn dann beim nächsten Testlauf erneut. Dies scheint als Befehle vor dem COPY-Cache korrekt zu funktionieren.
Zum Debuggen, ich Ausgeben der MD5-Prüfsumme der Datei Ich versuche, lokal zu kopieren, dann aus den Docker-Containern und sie paßt richtig. Also sollte der Cache theoretisch geladen werden. Ich bin nicht sicher, dass Docker MD5 als Prüfsumme verwendet.
Dies ist meine aktuelle circle.yml:
Maschine: Dienstleistungen: - Andockfenster
%Vor%Dies gibt der Build für die Prüfsummen-Schritte aus:
%Vor% Aber das docker build
meldet dies:
Weiß jemand, warum COPY nicht zwischenspeichert?
Docker verwendet ein TARSUM, um zu entscheiden, ob der Cache verwendet werden soll. Dazu gehören auch Dateimetadaten. Modifizierte Zeit am wichtigsten ... die Ausführung eines Git-Klons wird es zwingen, von Grund auf neu zu erstellen.
Um das zu umgehen, benutze ich ein Makefile mit dem folgenden Ziel ...
%Vor%(In meinem Fall ist alles, was ich wie requirements.txt-Dateien zwischengespeichert werden soll, in conf, mit Ausnahme des Gruntfile-Krams in der zweiten Zeile. Keiner von meinem tatsächlichen Quellcode, den ich zwischenspeichern möchte)
Ich habe das gleiche Problem mit drone.io (ein anderes CI-Tool).
Der Grund dafür ist, dass 'git clone' alle lokalen Dateien (über) schreibt, die dann auch den Zeitstempel der Zeit dieses Klons erhalten. Da Docker den Hash aller Dateien nimmt, die in einem COPY- oder ADD-Befehl hinzugefügt wurden, unterscheidet sich dieser Hash nun von dem vorherigen. Docker macht dann diesen Cache ungültig und wiederholt diesen Schritt und die folgenden.