Ich habe auf meinem Host-Computer verschiedene Verzeichnisse erstellt, um mehr über Docker zu erfahren, damit meine Docker-Dateien organisiert bleiben. Meine Docker-Datei, die ich gerade ausgeführt habe, sieht folgendermaßen aus:
FROM crystal/centos
MAINTAINER crystal
ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm
Meine tatsächliche Drehzahl beträgt nur 1 GB. Wenn ich dies versuche sudo docker build -t="crystal/test" .
, erhalte ich einen Build-Kontext an den Docker-Daemon mit 3,5 GB. Gibt es noch etwas, das mir nicht bekannt ist, wenn Sie weiterhin Docker-Images erstellen? Sammelt sich mein Speicher an, wenn ich mehr Bilder in meinen anderen Verzeichnissen auf meinem Host-Computer erstelle?
.dockerignore
Antworten:
Der Docker-Client sendet den gesamten "Build-Kontext" an den Docker-Daemon. Dieser Build-Kontext (standardmäßig) ist das gesamte Verzeichnis, in dem er sich
Dockerfile
befindet (also der gesamterpms
Baum).Sie können eine
.dockerignore
Datei einrichten, damit Docker einige Dateien ignoriert. Vielleicht möchten Sie damit experimentieren.Alternativ können Sie Ihren
rpms
Ordner eine Verzeichnisebene über Ihren Ordner verschiebenDockerfile
und nur einen Symlinktest.rpm
in dasDockerfile
Verzeichnis des Ordners erstellen .Wie viele Benutzer in den Kommentaren betonten , muss man den
.git
Ordner zu dem hinzufügen , der.dockerignore
die Ursache für einen Unterschied von 150 MB -> 5 GB in meinem Fall war.quelle
ADD
Befehl während eines Builds keinen Sym- Links folgt. Siehe: github.com/docker/docker/issues/1676tmp
log
zu.dockerignore
+ anderen benutzerdefinierten diejenigen.git
Ordner ist standardmäßig enthalten - das hat mich definitiv erwischt.Update 2019
Ab Docker v18.06 besteht die Möglichkeit, einen neuen Image Builder namens Build Kit zu verwenden .
Es ist im Lieferumfang des Docker enthalten und muss nicht installiert werden. Es ist abwärtskompatibel mit der
Dockerfile
Syntax, ohne dass die geändert werden mussDockerfile
.Legacy Docker Build gegen New Docker BuildKit
Hier ist ein Beispiel für das Erstellen eines Images mit einer riesigen nicht verwendeten Datei im Build-Verzeichnis:
Legacy Docker Build:
Neues Docker BuildKit:
Die einzige Änderung ist die
DOCKER_BUILDKIT=1
Umgebungsvariable, der Zeitunterschied ist enorm..dockerignore
DateiBitte beachten Sie, dass die
.dockerignore
Datei weiterhin gültig und nützlich ist. EinigeDockerfile
Befehle wieCOPY . .
berücksichtigen weiterhin die.dockerignore
Regeln.Dockerfile
Die Seitendateien im Build-Verzeichnis (auf die im nicht verwiesen wird ) werden vom BuildKit jedoch nicht mehr als "Build-Kontext" kopiert.quelle
Ich habe es behoben, indem ich meine Docker-Datei und docker-compose.yml in einen Unterordner verschoben habe, und es hat großartig funktioniert. Anscheinend sendet Docker den aktuellen Ordner an den Daemon und mein Ordner war 9 Gigs.
quelle
Wenn Sie eine
.dockerignore
Datei haben und der Build-Kontext immer noch groß ist, können Sie mit The Silver Searcher überprüfen, was an den Docker-Build-Kontext gesendet wird :Beachten Sie, dass einige
**
Muster möglicherweise nicht richtig funktionieren.Weitere Kommentare finden Sie in dieser Github-Ausgabe: https://github.com/moby/moby/issues/16056
quelle
In meinem Fall war das, als ich mit falschen
-f
Argumenten ausführte - ohne Pfad zum Verzeichnis, in dem sich Dockerfile befanddocker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- richtigdocker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- falschquelle
Wenn Sie die vollständige Kontrolle über Ihren Build-Kontext haben möchten, können Sie den Container auch vollständig ohne Kontext und
COPY
relevante Daten in den Container erstellen.Ein Nachteil davon wäre, dass Sie mit diesem Ansatz nur
ADD
Dinge in der Docker-Datei verwenden können, die auf eine Remote-URL verweisen, und keine Dateien von Ihrem lokalen Host.Siehe https://docs.docker.com/engine/reference/commandline/build/#build-with--
quelle
Ich hatte das gleiche Problem wie FreeStyler. Ich habe jedoch aus einem Verzeichnis erstellt, das aus meinem Kontext stammt. Die Argumente -f waren also korrekt, der Kontext war falsch.
Aus dem Docker-Verzeichnis zu bauen, war das Folgende in Ordnung
Beim Erstellen aus dem Dock-Verzeichnis hat sich der Build-Kontext geändert. Daher musste ich den Kontext im Befehl ändern. Der Kontext wird durch das '.' im obigen Befehl.
Der neue Befehl aus dem Projektverzeichnis sollte sein
Der Kontext hier ist durch die './base' gegeben.
quelle
Wenn Sie ein Image erstellen und den Build-Kontext für das Senden von Nachrichten an den Docker-Daemon erhalten, dessen Kopieren Protokollzeit benötigt,
Fügen Sie dann die .dockerignore-Datei hinzu . Es sollte die Dateien oder das Verzeichnis enthalten, die nicht kopiert werden müssen.
quelle
Für
NodeJS Application
, eine In -.dockerignore
Datei Ihres Root - Projektverzeichnis und in der.dockerignore
Datei die folgenden hinzufügenquelle