webentwicklung-frage-antwort-db.com.de

Docker laufen mit --Volume

Ich versuche, einige Dienste für die Entwicklung auf meinem Computer zu dockerisieren und frage mich, wie docker run --volume=.. funktioniert. Zum Beispiel, wenn ich so etwas mache

docker run --volume=/path/to/data:/data [...]

werden /path/to/data lokal (neu) erstellt werden nur wenn es nicht existiert? Werden die ursprünglichen Daten aus dem Image des Containers kopiert?
Links zu relevanten Dokumentationen sind erwünscht.

6
planetp

Die Option --volume Ist in den Referenzdokumenten docker run beschrieben, die Sie zu den dedizierten verwalteten Daten weiterleiten in Containern docs, die Sie dann weiterleiten an die Bind Reittiere docs.

Dort heißt es:

Wenn Sie mit -v Oder --volume Eine Datei oder ein Verzeichnis binden, das noch nicht auf dem Docker-Host vorhanden ist, erstellt -v Den Endpunkt für Sie. Es wird immer als Verzeichnis angelegt.

9

Ja, das Verzeichnis auf dem Host FS wird nur erstellt, wenn es noch nicht existiert.

Gleichzeitig kopiert Docker nichts aus dem Image in ein gebundenes Volume, sodass der Ladepfad als leeres Verzeichnis im Container angezeigt wird. Was auch immer auf dem Bild war, wird versteckt.

Wenn Sie Originaldaten zum Kopieren benötigen, müssen Sie diese Funktionalität selbst implementieren. Glücklicherweise ist das ziemlich einfach.

  1. Verschieben oder kopieren Sie unter den letzten Schritten in Dockerfile das ursprüngliche Verzeichnis an eine andere Stelle. Z.B. RUN mv /data /original-data
  2. Fügen Sie dem Image ein benutzerdefiniertes Skript hinzu, das als Eintrittspunkt dient, und kopiert die erforderlichen Daten auf das bereitgestellte Volume (siehe Codebeispiel unten). Dockerfile Direktive: ADD entrypoint.sh /entrypoint.sh
  3. Fügen Sie die ENTRYPOINT-Direktive hinzu, um Docker anzuweisen, Ihr Skript als Teil der Container-Initialisierung aufzurufen: ENTRYPOINT ['/entrypoint.sh']

Das Drehbuch entrypoint.sh könnte wie folgt aussehen (vereinfachtes Beispiel):

#!/bin/bash
set -e
SOURCE_DIR=/original-data 
TARGET_DIR=/data
if [ $(find $TARGET_DIR -maxdepth 0 -type d -empty) 2>/dev/null) ]; then
   cp -r --preserve-all $SOURCE_DIR/* $TARGET_DIR/
fi

# continue Docker container initialization, execute CMD
exec [email protected]

Wenn Ihr Bild bereits ein Entypoint-Skript enthält, können Sie ihm einfach die entsprechende Logik hinzufügen.

4
Hleb Rubanau