Ich lerne Docker und ich habe Zweifel darüber , wann und wo zu verwenden ADD
und VOLUME
. Ich denke, beide tun Folgendes:
HINZUFÜGEN
Kopieren Sie die Dateien beim Erstellen in das Image. Das Image enthält alle Dateien, sodass Sie es sehr einfach bereitstellen können. Auf der anderen Seite scheint es keine gute Idee in der Entwicklung zu sein, jedes Mal erstellen zu müssen, da der Entwickler beim Erstellen einen Befehl ausführen muss, um den Container neu zu erstellen. Darüber hinaus kann der Bau des Containers zeitaufwändig sein.
VOLUMEN
Ich verstehe, dass docker run -v
Sie mithilfe eines Host-Ordners in Ihrem Container mounten können. Auf diese Weise können Sie problemlos Dateien ändern und beobachten, wie die App in Ihrem Container auf die Änderungen reagiert. Es sieht in der Entwicklung gut aus, aber ich bin nicht sicher, wie ich meine Dateien auf diese Weise bereitstellen soll.
COPY
zuADD
. Sie sind fast gleich,ADD
verfügen jedoch über einige zusätzliche Funktionen für URLs und Archivdateien, die überraschend sein können.Antworten:
HINZUFÜGEN
Der grundlegende Unterschied zwischen diesen beiden besteht darin,
ADD
dass alles , was Sie hinzufügen, sei es ein Ordner oder nur eine Datei, tatsächlich Teil Ihres Bildes ist . Jeder, der das später erstellte Image verwendet, hat Zugriff auf alles, was Sie tunADD
. Dies gilt auch dann, wenn Sie es anschließend entfernen, da Docker in Ebenen arbeitet und dieADD
Ebene weiterhin als Teil des Bildes vorhanden ist. Um klar zu sein, Sie haben nurADD
etwas zur Erstellungszeit und können niemalsADD
zur Laufzeit.Einige Beispiele für Fälle, in denen Sie Folgendes verwenden möchten
ADD
:ADD ./requirements.txt /requirements.txt
gefolgt vonRUN pip install -r /requirements.txt
Sie möchten Ihren App-Code als Kontext in Ihrer Docker-Datei verwenden. Wenn Sie beispielsweise Ihr App-Verzeichnis als Arbeitsverzeichnis in Ihrem Image festlegen und den Standardbefehl in einem Container ausführen möchten, der von Ihrem Image ausgeführt wird, führen Sie Ihre App tatsächlich aus tun können:
ADD ./ /usr/local/git/my_app
WORKDIR /usr/local/git/my_app
CMD python ./main.py
VOLUMEN
Mit Volume hingegen kann ein Container, der von Ihrem Image ausgeführt wird, nur auf einen Pfad auf dem lokalen Computer zugreifen, auf dem der Container ausgeführt wird. Sie können keine Dateien aus Ihrem
VOLUME
Verzeichnis in Ihrer Docker-Datei verwenden . Alles , was in Ihrem Volumen Verzeichnis wird bei Build-Zeit nicht erreichbar sein , sondern wird zur Laufzeit zugänglich sein .Einige Beispiele für Fälle, in denen Sie Folgendes verwenden möchten
VOLUME
:/var/log/my_app
. Sie möchten, dass auf diese Protokolle auf dem Hostcomputer zugegriffen werden kann und nicht gelöscht wird, wenn der Container entfernt wird. Sie können dies tun, indem Sie einen Einhängepunkt erstellen,/var/log/my_app
indem Sie ihnVOLUME /var/log/my_app
zu Ihrer Docker-Datei hinzufügen und dann Ihren Container mit ausführendocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
VOLUME /etc/settings/my_app_settings
, Ihre Docker-Datei zu erweitern, Ihren Container mit auszuführendocker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag
und sicherzustellen, dass das Verzeichnis / host / settings / in allen Umgebungen vorhanden ist, in denen Ihre App ausgeführt werden soll.quelle
docker run -v $HOST_PATH:$CONTAINER_PATH node:latest node $CONTAINER_PATH/app.js
.Die
VOLUME
Anweisung erstellt zur Laufzeit ein Datenvolumen in Ihrem Docker-Container. Das als Argument angegebeneVOLUME
Verzeichnis ist ein Verzeichnis, das das Union-Dateisystem umgeht und hauptsächlich für persistente und gemeinsam genutzte Daten verwendet wird.Wenn Sie ausführen
docker inspect <your-container>
, sehen Sie unter demMounts
Abschnitt einen,Source
der den Verzeichnisspeicherort auf dem Host darstellt, und einen,Destination
der den gemounteten Verzeichnisspeicherort im Container darstellt. Beispielsweise,Hier sind 3 Anwendungsfälle für
docker run -v
:docker run -v /data
: Dies entspricht der Angabe derVOLUME
Anweisung in Ihrer Docker-Datei.docker run -v $host_path:$container_path
: Auf diese Weise können Sie zur Laufzeit$host_path
von Ihrem Host$container_path
in Ihren Container mounten . In der Entwicklung ist dies nützlich, um den Quellcode auf Ihrem Host für den Container freizugeben. In der Produktion kann dies verwendet werden, um Dinge wie die DNS-Informationen des Hosts (in/etc/resolv.conf
) oder Geheimnisse in den Container zu mounten . Umgekehrt können Sie diese Technik auch verwenden, um die Protokolle des Containers in bestimmte Ordner auf dem Host zu schreiben. Beides$host_path
und$container_path
müssen absolute Pfade sein.docker run -v my_volume:$container_path
: Dadurch wird ein Datenvolumen in Ihrem Container unter erstellt$container_path
und benanntmy_volume
. Dies entspricht im Wesentlichen dem Erstellen und Benennen eines Volumes mitdocker volume create my_volume
. Das Benennen eines solchen Volumes ist nützlich für ein Container-Daten-Volume und ein Shared-Storage-Volume mithilfe eines Multi-Host-Speichertreibers wie Flocker .Beachten Sie, dass der Ansatz zum Mounten eines Hostordners als Datenvolume in Dockerfile nicht verfügbar ist. Um die Docker-Dokumentation zu zitieren ,
Wenn Sie jetzt Ihre Dateien in Container in Nicht-Entwicklungsumgebungen kopieren möchten, können Sie die Anweisungen
ADD
oderCOPY
in Ihrer Docker-Datei verwenden. Diese verwende ich normalerweise für die Bereitstellung außerhalb der Entwicklung.quelle
ADD
Anweisung in Ihrer Docker-Datei zu haben, da sie nur vomdocker build
Befehl ausgeführt wird. Dies ist erforderlich, wenn andere Ihren Container zum ersten Mal erstellen und wenn Sie bereit sind, ihn in anderen Nichtentwicklungsumgebungen bereitzustellen.-v
Befehl für die Entwicklung zu verwenden, und eine andere Docker-Datei ein Image erstellen zu lassen, das die DateienADD
für die Bereitstellung enthält?ADD
? Insgesamt ein paar Sekunden? Wenn Sie zwei Dockerfile-Dateien haben und diese für andere freigeben (oder in der Docker-Registrierung veröffentlichen ), welche ist die Standardeinstellung? Sie haben zusätzlichen Wartungsaufwand, um sicherzustellen, dass die richtige Standard-Docker-Datei die richtigen Benutzer erreicht. Aber am Ende des Tages entscheiden Sie, was für Sie am besten funktioniert. Persönlich möchte ich sicherstellen, dass es nur eine Docker-Datei gibt, um meinen Container zu erstellen.