webentwicklung-frage-antwort-db.com.de

So stellen Sie lokale Datenträger in der Docker-Maschine bereit

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?

75
jdcaballerov

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 

  1. das aktuelle Arbeitsverzeichnis der Docker-Machine-Instanz abrufen docker-machine ssh <name> pwd

  2. 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.

  1. Ändern Sie den Volume-Einhängepunkt in Ihrer docker-compose.yml-Datei von .:/app in /root/<name_of_folder>:/app.

  2. 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

25
gbozee

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

Hinzufügen des Mount-Punkts für virtuelle Maschinen (Teil 1)

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)

  1. Starten Sie "Oracle VM VirtualBox Manager".
  2. Rechtsklick <machine name> (Standard)
  3. Die Einstellungen...
  4. Geteilte Ordner
  5. Der Ordner + Symbol auf der rechten Seite (Add Share)
  6. Ordnerpfad: <Host dir> (e :)
  7. Ordnername: <mount name> (e)
  8. Aktivieren Sie "Auto-Mount" und "Permanent machen" (Nur lesen, wenn Sie möchten ...) (Das Auto-Mount ist momentan irgendwie sinnlos ...)

Montage in boot2docker (Teil 2)

Manuell in boot2docker einhängen :

  1. Es gibt verschiedene Möglichkeiten, sich anzumelden. Verwenden Sie "Show" in "Oracle VM VirtualBox Manager" "oder ssh/PuTTY im Docker anhand der IP-Adresse docker-machine ip default usw.
  2. Sudo mkdir -p <local_dir>
  3. 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

  1. Bearbeiten/Erstellen (als Root) /mnt/sda1/var/lib/boot2docker/bootlocal.sh, sda1 kann für Sie anders sein ...
  2. 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

  • Bearbeiten (als root) /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 Version
  • rootfs/etc/rc.d/automount-shares bearbeiten
  • Fü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
  • Sichern Sie das alte boot2docker.iso und kopieren Sie das neue an seiner Stelle in ~/.docker/machine/machines /

Das funktioniert, es ist nur lang und kompliziert

docker-Version 1.8.1, Docker-Maschinenversion 0.4.0

89
Andy

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

14
claudevandort

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

( http://linuxcommand.org/man_pages/rsync1.html )

4
dmh

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

2
Jorge

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:

  1. Deinstallieren Sie zuerst VirtualBox.
    • Ja, das kann in anderen Tools wie Android Studio zu Problemen führen. Danke Docker :(
  2. Installieren Sie die neue Version von Docker Toolbox.

Beispiel für Redis-Datenbank:redis: image: redis:Alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"

Im Docker-Schnellstart-Terminal ....

  1. run docker-machine stop default - Stellen Sie sicher, dass VM fehlerhaft ist

In Oracle VM VirtualBox Manager ...

  1. Hinzufügen eines freigegebenen Ordners in default VM über oder über die Befehlszeile
    • D:\Projects\MyProject\db => /var/db

In docker-compose.yml ...

  1. Das zugeordnete Redis-Volume lautet: "/var/db/redis:/data:rw"

Im Docker-Schnellstart-Terminal ....

  1. Setze COMPOSE_CONVERT_WINDOWS_PATHS=0 (Für Toolbox Version> = 1.9.0)
  2. führen Sie docker-machine start default aus, um die VM neu zu starten.
  3. cd D:\Projects\MyProject\
  4. 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.

  1. Es kann nicht auf das Laufwerk D: Zugreifen
  2. Datenträgerpfade dürfen keine \ - Zeichen Enthalten.
    • docker-compose Fügt sie hinzu und beschuldigt Sie dann dafür !!
    • Verwenden Sie 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.

1
Tony O'Hagan

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.

0
nrjohnstone

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.

0
Thomasleveil

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'
0
Jesse

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.

0

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.

  1. Stoppen Sie die virtuelle Maschine (docker-machine stop).
  2. Ö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:

    • Ordnerpfad: D:\dev
    • Ordnername: d/dev

    Drücken Sie zweimal OK und schließen Sie die Virtual Box-GUI.

  3. Starten Sie die virtuelle Maschine (docker-machine start).

Das ist alles. Alle Pfade des Hostcomputers unter D:\dev sollten jetzt in docker-compose.yml Bereitstellungen funktionieren.

0