Ich habe ein Docker-Image aus einer Docker-Datei mit dem folgenden Befehl erstellt.
$ docker build -t u12_core -f u12_core .
Wenn ich versuche, es mit demselben Befehl neu zu erstellen, wird der Build-Cache wie folgt verwendet:
Step 1 : FROM ubuntu:12.04
---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <[email protected]>
---> Using cache
---> 4354ccf9dcd8
Step 3 : RUN apt-get update
---> Using cache
---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
---> Using cache
---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
---> Using cache
---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
---> Using cache
---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
---> Using cache
---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
---> Using cache
---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
---> Using cache
---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
---> Using cache
---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
---> Using cache
---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
---> Using cache
---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
---> Using cache
---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
---> Using cache
---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
---> Using cache
---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
---> Using cache
---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
---> Using cache
---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
---> Using cache
---> 25f5fe70fa84
Successfully built 25f5fe70fa84
Der Cache zeigt an, dass Aerospike installiert ist. Ich finde es jedoch nicht in Containern, die aus diesem Image hervorgehen. Daher möchte ich dieses Image neu erstellen, ohne den Cache zu verwenden. Wie kann ich Docker zwingen, ein sauberes Image ohne Cache neu zu erstellen?
RUN
Anweisungen zu minimieren .RUN
Direktive immer eine eigene Ebene erstellt , sodass eineDockerfile
mit vielenRUN
Direktiven enorm viel Speicherplatz beansprucht. Dies wurde jedoch in den letzten Versionen anscheinend etwas verbessert.docker-compose up -d
, wo kann ich es verwenden--no-cache
?docker-compose build --no-cache
und danndocker-compose up -d
Antworten:
Es gibt eine
--no-cache
Option:In älteren Versionen von Docker mussten Sie bestehen
--no-cache=true
, dies ist jedoch nicht mehr der Fall.quelle
--no-cache
funktioniertdocker-compose build
.--pull
. Dadurch wird Docker angewiesen, die neueste Version des Basisimages abzurufen. Dies ist zusätzlich erforderlich,--no-cache
wenn Sie bereits über das Basis-Image (z. B. :) verfügenubuntu/latest
und das Basis-Image seit dem letzten Abrufen aktualisiert wurde. Siehe die Dokumente hier .--pull
Option hat den Trick für mich getan. Nur--no-cache
bauen noch kaputt. Setzen Sie--pull
auch ein, bauen funktioniert! Vielen Dank!In einigen extremen Fällen können Sie wiederkehrende Buildfehler nur ausführen, indem Sie Folgendes ausführen:
Der Befehl fordert Sie zur Bestätigung auf:
Dies ist natürlich keine direkte Antwort auf die Frage, könnte aber einige Leben retten ... Es hat meine gerettet.
quelle
Docker version 17.09.0-ce, build afdb6d4
docker
auf die gleiche Version aktualisiert und es funktioniert, danke.docker builder prune
zum Löschen der zwischengespeicherten Build-Layer. Bin gerade in die Falle gegangen, nachdem ich blind Befehle aus dem Stapelüberlauf kopiert habe.Der Befehl hat
docker build --no-cache .
unser ähnliches Problem gelöst.Unsere Docker-Datei war:
Sollte aber gewesen sein:
Um zu verhindern, dass das Update zwischengespeichert und separat installiert wird.
Siehe: Best Practices zum Schreiben von Docker-Dateien
quelle
RUN apt-get update && apt-get -y install php5-fpm
Ihnen vorhanden ist, wird diese weiterhin mit dem alten Inhalt wiederverwendet.Verwenden Sie beim Erstellen die folgenden Optionen, um sicherzustellen, dass Ihr Build vollständig neu erstellt wird, einschließlich der Überprüfung des Basisimages auf Aktualisierungen:
--no-cache
- Dadurch wird die Wiederherstellung bereits verfügbarer Ebenen erzwungen--pull
- Dadurch wird ein Pull des Basisabbilds ausgelöst, auf das mit FROM verwiesen wird, um sicherzustellen, dass Sie die neueste Version erhalten haben.Der vollständige Befehl sieht daher folgendermaßen aus:
Für Docker-Compose stehen dieselben Optionen zur Verfügung:
quelle
Ich würde nicht empfehlen,
--no-cache
in Ihrem Fall zu verwenden.Sie führen einige Installationen von Schritt 3 bis 9 aus (ich würde übrigens lieber einen Einzeiler verwenden), und wenn Sie nicht möchten, dass diese Schritte bei jedem Erstellen Ihres Images erneut ausgeführt werden, können Sie dies tun Ändern Sie Ihre
Dockerfile
mit einem vorübergehenden Schritt vor Ihrerwget
Anweisung.Ich mache so etwas
RUN ls .
und ändere es aufRUN ls ./
dannRUN ls ./.
und so weiter für jede Änderung, die an dem Tarball vorgenommen wird, der von abgerufen wurdewget
Sie können natürlich so etwas wie
RUN echo 'test1' > test && rm test
die Anzahl'test1
für jede Iteration erhöhen .Es sieht schmutzig aus, aber meines Wissens ist es der effizienteste Weg, um weiterhin vom Cache-System von Docker zu profitieren, das Zeit spart, wenn Sie viele Ebenen haben ...
quelle
Mit Docker-Compose versuchen
docker-compose up -d --build --force-recreate
quelle
Die meisten Informationen hier sind korrekt.
Hier eine Zusammenstellung von ihnen und meine Art, sie zu benutzen.
Die Idee ist, sich an den empfohlenen Ansatz zu halten (spezifisch erstellen und keine Auswirkungen auf andere gespeicherte Docker-Objekte haben) und den radikaleren Ansatz zu versuchen (nicht spezifisch erstellen und Auswirkungen auf andere gespeicherte Docker-Objekte haben), wenn dies nicht ausreicht.
Empfohlener Ansatz:
1) Erzwingen Sie die Ausführung jedes Schritts / jeder Anweisung in der Docker-Datei:
oder mit
docker-compose build
:Wir könnten das auch mit dem
up
Unterbefehl kombinieren, der alle Container neu erstellt:Auf diese Weise wird kein Cache verwendet, sondern für den Docker-Builder und das Basis-Image, auf das mit der
FROM
Anweisung verwiesen wird .2) Löschen Sie den Docker Builder-Cache (wenn wir Buildkit verwenden, brauchen wir das sehr wahrscheinlich):
3) Wenn wir den Cache der übergeordneten Bilder nicht verwenden möchten, können wir versuchen, sie zu löschen, z. B.:
In den meisten Fällen sind diese drei Dinge perfekt genug, um einen sauberen Aufbau unseres Images zu ermöglichen.
Also sollten wir versuchen, uns daran zu halten.
Radikalerer Ansatz:
In Eckfällen, in denen es den Anschein hat, dass einige Objekte im Docker-Cache während des Builds noch verwendet werden und dies wiederholbar erscheint, sollten wir versuchen, die Ursache zu verstehen, um das fehlende Teil sehr spezifisch löschen zu können. Wenn wir wirklich keine Möglichkeit finden, von Grund auf neu zu erstellen, gibt es andere Möglichkeiten, aber es ist wichtig zu bedenken, dass diese im Allgemeinen viel mehr löschen, als erforderlich ist. Daher sollten wir sie insgesamt mit Vorsicht verwenden, wenn wir uns nicht in einer lokalen / Entwicklungsumgebung befinden.
1) Entfernen Sie alle Bilder ohne mindestens einen zugehörigen Container:
2) Entfernen Sie viele weitere Dinge:
Das sagt :
Die Verwendung dieses Super-Löschbefehls reicht möglicherweise nicht aus, da er stark vom Status der Container abhängt (ausgeführt oder nicht). Wenn dieser Befehl nicht ausreicht, versuche ich sorgfältig zu überlegen, welche Docker-Container Nebenwirkungen auf unseren Docker-Build verursachen können, und zuzulassen, dass diese Container beendet werden, damit sie mit dem Befehl entfernt werden können.
quelle
Sie können den Builder-Cache mit verwalten
docker builder
So bereinigen Sie den gesamten Cache ohne Eingabeaufforderung:
docker builder prune -af
quelle