Ich versuche, Docker-Maschine mit Docker-Compose zu verwenden. Die Datei docker-compose.yml hat folgende Definitionen:
web:
build: .
command: ./run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
Beim Ausführen von docker-compose up -d
läuft alles gut, bis versucht wird, den Befehl auszuführen und ein Fehler ausgegeben wird:
Der Container kann nicht gestartet werden
Lokale Datenträger werden nicht an den Remote-Computer angehängt. Was ist die empfohlene Strategie, um die lokalen Volumes mit dem Code der Webapps bereitzustellen?
Dieses Problem trat auch auf und es sieht so aus, als würden lokale Datenträger bei der Verwendung von Docker-Maschinen nicht bereitgestellt. Eine Hacklösung ist zu
das aktuelle Arbeitsverzeichnis der Docker-Machine-Instanz abrufen docker-machine ssh <name> pwd
verwenden Sie ein Befehlszeilentool wie rsync
, um den Ordner auf das Remote-System zu kopieren
rsync -avzhe ssh --progress <name_of_folder> [email protected]_ip:<result _of_pwd_from_1>.
Der Standardwert für pwd ist/root. Der obige Befehl wäre rsync -avzhe ssh --progress <name_of_folder> [email protected]_ip:/root
.
Hinweis: Sie müssen das Kennwort für das Remote-System eingeben. Sie können schnell eine von ssh in das Remote-System erstellen und ein Kennwort erstellen.
Ändern Sie den Volume-Einhängepunkt in Ihrer docker-compose.yml
-Datei von .:/app
in /root/<name_of_folder>:/app
.
docker-compose up -d
ausführen
Wenn Sie Änderungen lokal vornehmen, vergessen Sie nicht, rsync
erneut auszuführen, um die Änderungen auf das Remote-System zu übertragen.
Es ist nicht perfekt, aber es funktioniert. Ein Problem ist laufend https://github.com/docker/machine/issues/179
Andere Projekte, die versuchen, dieses Problem zu lösen, umfassen docker-rsync
Docker-Maschine stellt das Benutzerverzeichnis automatisch hoch ... Aber manchmal reicht das nicht aus.
Ich kenne Docker 1.6 nicht, aber in 1.8 fügen Sie CAN ein zusätzliches Mount zu Docker-Maschinen hinzu
CLI: (Funktioniert nur bei gestoppter Maschine)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <Host_dir> --automount
Also ein Beispiel in Windows wäre
/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe sharedfolder add default --name e --hostpath 'e:\' --automount
GUI: (erfordert nicht, dass die Maschine gestoppt wird)
<machine name>
(Standard)<Host dir>
(e :)<mount name>
(e)Manuell in boot2docker einhängen :
docker-machine ip default
usw.Sudo mkdir -p <local_dir>
Sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
Dies ist jedoch nur gut, wenn Sie den Computer neu starten und der Mount verloren geht.
Hinzufügen eines Automount zu boot2docker :
Während Sie an der Maschine angemeldet sind
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 kann für Sie anders sein ...Hinzufügen
mkdir -p <local_dir>
mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
Mit diesen Änderungen sollten Sie einen neuen Einhängepunkt haben. Dies ist eine der wenigen Dateien, die ich beim Booten finden konnte und dauerhaft ist. Bis es eine bessere Lösung gibt, sollte dies funktionieren.
Alte Methode: Weniger empfohlen , aber als Alternative belassen
/mnt/sda1/var/lib/boot2docker/profile
, sda1 kann für Sie anders sein ...Hinzufügen
add_mount() {
if ! grep -q "try_mount_share $1 $2" /etc/rc.d/automount-shares ; then
echo "try_mount_share $1 $2" >> /etc/rc.d/automount-shares
fi
}
add_mount <local dir> <mount name>
Als letzte Möglichkeit können Sie die etwas langwierigere Alternative wählen und das Startabbild einfach ändern.
git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
cd boot2docker
git -c core.autocrlf=false checkout v1.8.1
#oder die entsprechende Versionrootfs/etc/rc.d/automount-shares
bearbeitenFügen Sie try_mount_share <local_dir> <mount_name>
-Zeile unmittelbar vor fi am Ende hinzu. Zum Beispiel
try_mount_share /e e
Stellen Sie nur sicher, dass Sie nichts auf das Betriebssystem setzen, wie/bin usw.
docker build -t boot2docker .
#Dies dauert beim ersten Mal ungefähr eine Stunde :(docker run --rm boot2docker > boot2docker.iso
Das funktioniert, es ist nur lang und kompliziert
docker-Version 1.8.1, Docker-Maschinenversion 0.4.0
Momentan sehe ich keine Möglichkeit, Volumes auf Computern zu mounten. Daher besteht der Ansatz jetzt darin, die benötigten Dateien irgendwie auf den Computer zu kopieren oder zu synchronisieren.
Es gibt Gespräche , wie Sie dieses Problem im Github-Repo der Docker-Maschine lösen können. Jemand hat eine Pull-Anforderung Implementierung von - scp auf Docker-Maschine erstellt und auf Master bereits zusammengeführt. Daher ist es sehr wahrscheinlich, dass er in der nächsten Version enthalten ist.
Da es noch nicht veröffentlicht ist, empfehle ich Ihnen, wenn Sie Ihren Code auf github gehostet haben, nur Ihr Repo zu klonen, bevor Sie die App ausführen
web:
build: .
command: git clone https://github.com/my/repo.git; ./repo/run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
Update: Beim Nachschlagen habe ich festgestellt, dass die Funktion bereits in den neuesten Binärdateien verfügbar ist. Wenn Sie sie erhalten, können Sie Ihr lokales Projekt kopieren, indem Sie einen Befehl wie folgt ausführen:
docker-machine scp -r . dev:/home/docker/project
Dies ist die allgemeine Form:
docker-machine scp [machine:][path] [machine:][path]
So können Sie Dateien von, zu und zwischen Computern kopieren.
Prost! 1
Wenn Sie die Docking-Maschine mit der Option rsync auswählen, können Sie sie mit dem Befehl docker-machine ssh <machinename>
folgendermaßen kombinieren:
rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<Host_directory_to_sync_to>
Es verwendet dieses Befehlsformat von rsync, wobei Host
leer bleibt:
rsync [OPTION]... SRC [SRC]... [[email protected]]Host:DEST
Seit Oktober 2017 gibt es einen neuen Befehl für Docker-Computer, der den Trick ausführt. Stellen Sie jedoch sicher, dass sich im Verzeichnis nichts befindet, bevor Sie es ausführen. Andernfalls könnte es verloren gehen:
docker-machine mount <machine-name>:<guest-path> <Host-path>
Weitere Informationen finden Sie in den Dokumenten: https://docs.docker.com/machine/reference/mount/
PR mit der Änderung: https://github.com/docker/machine/pull/4018
Schließlich wurde herausgefunden, wie Sie Windows Docker Toolbox auf Version 1.12.5 aktualisieren und meine Volumes weiterhin verwenden können, indem Sie einen freigegebenen Ordner im Manager Oracle VM VirtualBox
Hinzufügen und die Pfadkonvertierung deaktivieren. Wenn Sie über Windows 10 verfügen, sollten Sie den neueren Docker für Windows verwenden.
1. das Upgrade Pain:
Beispiel für Redis-Datenbank:redis: image: redis:Alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"
Im Docker-Schnellstart-Terminal ....
docker-machine stop default
- Stellen Sie sicher, dass VM fehlerhaft istIn Oracle VM VirtualBox Manager ...
default
VM über oder über die Befehlszeile D:\Projects\MyProject\db
=> /var/db
In docker-compose.yml
...
"/var/db/redis:/data:rw"
Im Docker-Schnellstart-Terminal ....
COMPOSE_CONVERT_WINDOWS_PATHS=0
(Für Toolbox Version> = 1.9.0)docker-machine start default
aus, um die VM neu zu starten.cd D:\Projects\MyProject\
docker-compose up
Sollte jetzt funktionieren.Erstellt nun eine Redis-Datenbank in D:\Projects\MyProject\db\redis\dump.rdb
Warum relative Host-Pfade vermeiden?
Ich habe relative Host-Pfade für Windows Toolbox vermieden, da sie möglicherweise ungültige '\' Zeichen einführen. Es ist nicht so schön, wie Pfade im Verhältnis zu docker-compose.yml
Zu verwenden, aber zumindest meine Kollegen können es leicht tun, selbst wenn sich ihr Projektordner an einem anderen Ort befindet, ohne die docker-compose.yml
- Datei hacken zu müssen (schlecht für SCM).
Originalausgabe
Zu Ihrer Information ... Hier ist der ursprüngliche Fehler, den ich bei der Verwendung von relativ sauberen Pfaden erhalten habe, die bei älteren Versionen einwandfrei funktionierten. Mein Volume-Mapping war früher nur "./db/redis:/data:rw"
ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\\Projects\\MyProject\\db\\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/data
Dies bricht aus zwei Gründen.
D:
Zugreifen\
- Zeichen Enthalten.docker-compose
Fügt sie hinzu und beschuldigt Sie dann dafür !!COMPOSE_CONVERT_WINDOWS_PATHS=0
, Um diesen Unsinn zu stoppen.Ich empfehle, die zusätzliche Zuordnung Ihres VM freigegebenen Ordners in Ihrer docker-compose.yml
- Datei zu dokumentieren, da Sie VirtualBox möglicherweise erneut deinstallieren und den freigegebenen Ordner zurücksetzen müssen. Auf jeden Fall werden Ihre Kollegen Sie dafür lieben.
Ich dachte nur, ich erwähne, dass ich 18.03.1-ce-win65 (17513) unter Windows 10 verwendet habe, und ich habe bemerkt, dass, wenn Sie zuvor ein Laufwerk freigegeben und die Anmeldeinformationen zwischengespeichert haben, Ihr Docker das Passwort ändern wird, sobald Sie es ändern die in Containern gelagerten Volumes sind leer.
Es gibt keine Hinweise darauf, dass tatsächlich der Zugriff auf die mit den alten zwischengespeicherten Anmeldeinformationen gemeinsam genutzten Anmeldeinformationen fehlschlägt. Die Lösung in diesem Szenario besteht darin, die Anmeldeinformationen entweder über die Benutzeroberfläche (Einstellungen -> Gemeinsam genutzte Laufwerke) oder zurückzusetzen dann deaktivieren, dann kann das Laufwerk freigegeben werden, und geben Sie das neue Kennwort ein.
Es wäre nützlich, wenn Docker-Compose in diesen Situationen einen Fehler ausgibt.
Ich gehe davon aus, dass sich die run_web.sh
-Datei im selben Verzeichnis befindet wie Ihre docker-compose.yml
-Datei. Dann sollte der Befehl command: /app/run_web.sh
sein.
Es sei denn, die Dockerfile
(die Sie nicht offen legen) kümmert sich darum, die run_web.sh
-Datei in das Docker-Image einzufügen.
Nach zusammenfassender Posts hier angehängtes aktualisiertes Skript, um zusätzlichen Host-Einhängepunkt zu erstellen und beim Neustart von Virtualbox Automount auszuführen. Die Arbeitsumgebung kurz wie folgt: - Windows 7 - docker-machine.exe Version 0.7.0 - VirtualBox 5.0.22
#!env bash
: ${NAME:=default}
: ${SHARE:=c/Proj}
: ${MOUNT:=/c/Proj}
: ${VBOXMGR:=C:\Program Files\Oracle\VirtualBox\VBoxManage.exe}
SCRIPT=/mnt/sda1/var/lib/boot2docker/bootlocal.sh
## set -x
docker-machine stop $NAME
"$VBOXMGR" sharedfolder add $NAME --name c/Proj --hostpath 'c:\' --automount 2>/dev/null || :
docker-machine start $NAME
docker-machine env $NAME
docker-machine ssh $NAME 'echo "mkdir -p $MOUNT" | Sudo tee $SCRIPT'
docker-machine ssh $NAME 'echo "Sudo mount -t vboxsf -o rw,user $SHARE $MOUNT" | Sudo tee -a $SCRIPT'
docker-machine ssh $NAME 'Sudo chmod +x /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
docker-machine ssh $NAME 'Sudo /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
#docker-machine ssh $NAME 'ls $MOUNT'
Ich verwende Docker-Maschine 0.12.2 mit dem Virtualbox-Laufwerk auf meiner lokalen Maschine. Ich habe festgestellt, dass es ein Verzeichnis /hosthome/$(user name)
gibt, von dem aus Sie auf lokale Dateien zugreifen können.
Alle anderen Antworten waren für die Zeit gut, aber jetzt (Docker Toolbox v18.09.3) funktioniert alles sofort. Sie müssen nur einen freigegebenen Ordner in VirtualBox VM hinzufügen.
Docker Toolbox fügt C:\Users
automatisch als freigegebenen Ordner /c/Users
unter einer virtuellen Linux-Maschine hinzu (mithilfe der Funktion für freigegebene Ordner in Virtual Box). Befindet sich Ihre docker-compose.yml
-Datei also irgendwo unter diesem Pfad und hängen Sie die Host-Maschine ein Verzeichnisse nur unter diesem Pfad - alle sollten sofort funktionieren.
Zum Beispiel:
C:\Users\username\my-project\docker-compose.yml
:
...
volumes:
- .:/app
...
Der .
Pfad wird automatisch in den absoluten Pfad C:\Users\username\my-project
und dann in /c/Users/username/my-project
konvertiert. Und genau so wird dieser Pfad aus Sicht der virtuellen Linux-Maschine gesehen (Sie können ihn überprüfen: docker-machine ssh
und dann ls /c/Users/username/my-project
). Das endgültige Mount ist also /c/Users/username/my-project:/app
.
Alles funktioniert für Sie transparent.
Dies funktioniert jedoch nicht, wenn sich Ihr Host-Mount-Pfad nicht unter dem Pfad C:\Users
befindet. Wenn Sie beispielsweise denselben docker-compose.yml
unter D:\dev\my-project
einfügen.
Dies kann jedoch leicht behoben werden.
docker-machine stop
).Öffnen Sie die Virtual Box-Benutzeroberfläche, öffnen Sie die Einstellungen der virtuellen Maschine mit dem Namen default
, öffnen Sie den Abschnitt Shared Folders
und fügen Sie den neuen freigegebenen Ordner hinzu:
D:\dev
d/dev
Drücken Sie zweimal OK
und schließen Sie die Virtual Box-GUI.
docker-machine start
).Das ist alles. Alle Pfade des Hostcomputers unter D:\dev
sollten jetzt in docker-compose.yml
Bereitstellungen funktionieren.