2014-09-22 4 views
8

funktioniert Bitte beachten Sie die folgenden Dockerfile:Schreiben auf Andockfenster Volumen von Dockerfile nicht

FROM phusion/baseimage 
VOLUME ["/data"] 
RUN touch /data/HELLO 
RUN ls -ls /data 

Problem: „/ data“ Verzeichnis enthält nicht „HALLO“ -Datei. Außerdem sind alle anderen Versuche, in das Volume-Verzeichnis zu schreiben (über echo, mv, cp, ...) nicht erfolgreich - das Verzeichnis ist immer leer. Keine Fehlermeldungen angezeigt.

Ich konnte nichts in der Dokumentation oder Stackoverflow in Bezug auf dieses Problem finden.

Ist das etwas bekannt oder neu?

docker version kehrt:

Client version: 1.2.0 
Client API version: 1.14 
Go version (client): go1.3.1 
Git commit (client): fa7b24f 
OS/Arch (client): linux/amd64 
Server version: 1.2.0 
Server API version: 1.14 
Go version (server): go1.3.1 
Git commit (server): fa7b24f 

Antwort

8

Jeder Schritt des Dockerfile in einem eigenen Container ausgeführt wird, der verworfen wird, wenn dieser Schritt getan ist, und Volumina verworfen werden, wenn die letzten (in diesem Fall nur) Behälter, der verwendet Sie werden gelöscht, nachdem der Befehl beendet wurde. Dies macht Volumes schlecht geeignet für die Verwendung in Dockerfiles, weil sie ihren Inhalt auf halbem Weg verlieren. Docker-Dateien sollen überall ausgeführt werden können, und wenn sie Volumes verwenden, die dauerhaft bleiben, würde dies das Problem erschweren. Auf der anderen Seite, wenn Sie dies wirklich wollen, einfach das Volume mit einem Verzeichnis auf dem Host zurück.

PS: Die Initialisierung des Datenverzeichnisses des Hosts erfolgt am besten außerhalb der Docker-Datei.

Letztes Mal habe ich dies erforderlich verließ ich diesen Schritt aus der Docker-Datei, weil die Idee von diesem Schritt die Host vorzubereiten das Bild von diesem Dockerfile erzeugt auszuführen. Dann machte ich einen Container mit Docker Run und innerhalb dieses Containers lief ich die üblichen DB-Setup-Sachen.

docker run -v /var/lib/mysql:/raid/.../mysql ... 
/usr/bin/mysql_install_db 
mysql_secure_installation 

Nun, wenn dieser Container auf einen neuen Host bewegt wird, dass Datenverzeichnis kann entweder mit sich gebracht werden, oder auf dem Host mit dem gleichen Verfahren erstellt. Oder wenn Sie, wie in meinem Beispiel, eine andere MySQL-Datenbank für eine andere Anwendung verwenden möchten, müssen Sie die Containererstellung nicht wiederholen.

Die wichtige Idee ist, die Container-Erstellung und das Host-Setup separat zu halten.

+0

Vielen Dank für eine sehr gute Erklärung der Problemquelle. Wie kann ich das Volume mit einem Verzeichnis "zur Build-Zeit" sichern ?. So wird beispielsweise die Datenbankinitialisierung während des Builds durchgeführt. – akhikhl

+0

Ich werde dies in einer Bearbeitung anseren. –