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 läuft docker-compose up -d
alles gut, bis versucht wird, den Befehl auszuführen und ein Fehler auftritt:
Container b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d kann nicht gestartet werden: [8] Systemfehler: exec: "./run_web.sh": stat ./run_web.sh: Keine solche Datei oder kein solches Verzeichnis
Lokale Volumes werden nicht auf dem Remotecomputer bereitgestellt. Welche Strategie wird empfohlen, um die lokalen Volumes mit dem Code der Webanwendungen bereitzustellen?
docker
dockerfile
docker-compose
jdcaballerov
quelle
quelle
Antworten:
Docker-Maschine stellt das Benutzerverzeichnis automatisch bereit ... Aber manchmal reicht das einfach nicht aus.
Ich weiß nichts über Docker 1.6, aber in 1.8 KÖNNEN Sie Docker-Maschinen einen zusätzlichen Mount hinzufügen
Mountpunkt für virtuelle Maschine hinzufügen (Teil 1)
CLI : (Funktioniert nur bei angehaltener Maschine)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount
Ein Beispiel in Windows wäre also
GUI : (erfordert NICHT, dass die Maschine gestoppt wird)
<machine name>
(Standard)<host dir>
(e :)<mount name>
(e)Montage im boot2docker (Teil 2)
Manuelles Mounten in boot2docker :
docker-machine ip default
usw. zu verwenden.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, bis Sie die Maschine neu starten und dann die Halterung verloren geht ...
Hinzufügen eines Automount zu boot2docker :
Während Sie am Computer angemeldet sind
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 kann für Sie anders sein ...Hinzufügen
Mit diesen Änderungen sollten Sie einen neuen Einhängepunkt haben. Dies ist eine der wenigen Dateien, die beim Booten aufgerufen wurden und dauerhaft sind. 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
Als letzten Ausweg können Sie die etwas langwierigere Alternative wählen und einfach das Startabbild ä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 Ihre entsprechende Versionrootfs/etc/rc.d/automount-shares
Fügen Sie
try_mount_share <local_dir> <mount_name>
am Ende kurz vor fi eine Zeile hinzu. BeispielsweiseStellen Sie nur sicher, dass Sie nichts einstellen, was das Betriebssystem benötigt, wie / bin usw.
docker build -t boot2docker .
#Dies wird beim ersten Mal ungefähr eine Stunde dauern :(docker run --rm boot2docker > boot2docker.iso
Das funktioniert, es ist nur lang und kompliziert
Docker-Version 1.8.1, Docker-Maschine Version 0.4.0
quelle
/mnt/sda1/var/lib/boot2docker/profile
. Können Sie erklären, warum Sie zur Verwendung gewechselt sind/mnt/sda1/var/lib/boot2docker/bootlocal.sh
? Auch das Durchstreichen dieses Textes trägt nicht zur Lesbarkeit Ihrer Antwort bei ;-)bootlocal.sh
Methode nicht mehr vorschlage . Ich kann nur sagen, dass es sauberer aussieht, nur einen Mount-Befehl wiebootlocal.sh
im Profil zu verwenden, als im Profil. Außerdem glaube ich normalerweise, dass dasprofile
Mount mehrmals ausgeführt werden kann und ein Mount nur einmal ausgeführt werden muss, sodass es sinnvoller ist. Aber beide können funktionieren.Auch auf dieses Problem gestoßen und es sieht so aus, als ob lokale Volumes bei Verwendung der Docker-Maschine nicht gemountet werden. Eine Hack-Lösung ist zu
Holen Sie sich das aktuelle Arbeitsverzeichnis der Docker-Machine-Instanz
docker-machine ssh <name> pwd
Verwenden Sie ein Befehlszeilentool,
rsync
um Ordner auf das Remote-System zu kopierenDas Standard-pwd ist / root, also wäre der obige Befehl
rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root
Hinweis: Sie müssten das Kennwort für das Remote-System angeben. Sie können schnell eine erstellen, indem Sie ssh in das Remote-System einfügen und ein Kennwort erstellen.
Ändern Sie den Volume-Mount-Punkt in Ihrer
docker-compose.yml
Datei von.:/app
auf/root/<name_of_folder>:/app
Lauf
docker-compose up -d
Hinweis: Wenn Änderungen lokal vorgenommen werden, vergessen Sie nicht, sie erneut
rsync
auszuführen, um die Änderungen auf das Remote-System zu übertragen.Es ist nicht perfekt, aber es funktioniert. Ein Problem besteht derzeit unter https://github.com/docker/machine/issues/179
Andere Projekte, die versuchen, dieses Problem zu lösen, sind docker-rsync
quelle
exit status 255
wiederherzustellen, muss die Maschine vollständig neu erstellt werden.docker 1.10
unddocker-machine 0.6.0
gist.github.com/cristobal/fcb0987871d7e1f7449eIm Moment sehe ich keine Möglichkeit, Volumes auf Computern bereitzustellen, daher besteht der Ansatz jetzt darin, die benötigten Dateien irgendwie auf den Computer zu kopieren oder zu synchronisieren.
Es gibt Gespräche darüber, wie dieses Problem im Github-Repo der Docker-Maschine gelöst werden kann. Jemand hat eine Pull-Anfrage gestellt, die scp auf der Docker-Maschine implementiert , und es ist bereits auf dem Master zusammengeführt, so dass es sehr wahrscheinlich ist, dass die nächste Version es enthalten wird.
Da es noch nicht veröffentlicht ist, würde ich empfehlen, dass Sie, wenn Sie Ihren Code auf github gehostet haben, einfach Ihr Repo klonen, bevor Sie die App ausführen
Update: Bei näherer Betrachtung stellte ich fest, dass die Funktion bereits in den neuesten Binärdateien verfügbar ist. Wenn Sie diese erhalten, können Sie Ihr lokales Projekt kopieren, indem Sie einen Befehl wie den folgenden ausführen:
Dies ist die allgemeine Form:
So können Sie Dateien von, zu und zwischen Computern kopieren.
Prost! 1
quelle
Seit Oktober 2017 gibt es einen neuen Befehl für die Docker-Maschine, der den Trick ausführt. Stellen Sie jedoch sicher, dass sich nichts im Verzeichnis befindet, bevor Sie es ausführen, da es sonst verloren gehen kann:
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
quelle
...:<guest-path> <host-path>
(und nicht umgekehrt). So etwas Einfaches und Kritisches ist in der Dokumentation zu vermerken ... ist es einfach nicht!Wenn Sie die Option rsync mit Docker-Maschine wählen, können Sie sie mit dem folgenden
docker-machine ssh <machinename>
Befehl 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 und lässt
HOST
leer:rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
( http://linuxcommand.org/man_pages/rsync1.html )
quelle
Schließlich haben Sie herausgefunden, wie Sie die Windows Docker Toolbox auf Version 1.12.5 aktualisieren und meine Volumes am Laufen halten können, indem Sie einen freigegebenen Ordner im
Oracle VM VirtualBox
Manager hinzufügen und die Pfadkonvertierung deaktivieren. Wenn Sie Windows 10+ haben, verwenden Sie am besten den neueren Docker für Windows.1. das Upgrade Schmerz:
Beispiel für eine 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 die VM beschädigt istIn Oracle VM VirtualBox Manager ...
default
VM wurde über oder über die Befehlszeile hinzugefügtD:\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
, um die VM neu zu starten.cd D:\Projects\MyProject\
docker-compose up
sollte jetzt funktionieren.Jetzt wird die Redis-Datenbank in erstellt
D:\Projects\MyProject\db\redis\dump.rdb
Warum relative Hostpfade vermeiden?
Ich habe relative Hostpfade für Windows Toolbox vermieden, da sie möglicherweise ungültige '\' Zeichen einführen. Es ist nicht so schön wie das Verwenden von Pfaden im Vergleich zu,
docker-compose.yml
aber zumindest meine Kollegen können es problemlos tun, selbst wenn sich ihr Projektordner an einer anderen Stelle befindet, ohne diedocker-compose.yml
Datei hacken zu müssen (schlecht für SCM).Ursprüngliches Problem
Zu Ihrer Information ... Hier ist der ursprüngliche Fehler, den ich erhalten habe, als ich schöne, saubere relative Pfade verwendet habe, die früher für ältere Versionen einwandfrei funktionierten. Früher war meine Volumenzuordnung gerecht
"./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:
Laufwerk zugreifen\
Zeichen enthaltendocker-compose
fügt sie hinzu und beschuldigt dich dann dafür !!COMPOSE_CONVERT_WINDOWS_PATHS=0
, um diesen Unsinn zu stoppen.Ich empfehle, Ihre zusätzliche Zuordnung von freigegebenen VM-Ordnern in Ihrer
docker-compose.yml
Datei zu dokumentieren, da Sie VirtualBox möglicherweise erneut deinstallieren und den freigegebenen Ordner zurücksetzen müssen. Ihre Kollegen werden Sie trotzdem dafür lieben.quelle
Alle anderen Antworten waren für die damalige Zeit gut, aber jetzt (Docker Toolbox v18.09.3) funktioniert alles sofort. Sie müssen lediglich einen freigegebenen Ordner zur VirtualBox-VM hinzufügen.
Docker Toolbox wird automatisch
C:\Users
als freigegebener Ordner/c/Users
unter einem virtuellen Linux-Computer hinzugefügt (mithilfe der Funktion "Freigegebene Ordner" von Virtual Box). Wenn sich Ihredocker-compose.yml
Datei also irgendwo unter diesem Pfad befindet und Sie die Verzeichnisse des Host-Computers nur unter diesem Pfad bereitstellen, sollten alle sofort funktionieren.Beispielsweise:
C:\Users\username\my-project\docker-compose.yml
::Der
.
Pfad wird automatisch in einen absoluten PfadC:\Users\username\my-project
und dann in konvertiert/c/Users/username/my-project
. Und genau so wird dieser Pfad aus der Sicht der virtuellen Linux-Maschine gesehen (Sie können ihn überprüfen:docker-machine ssh
und dannls /c/Users/username/my-project
). Das endgültige Reittier wird also sein/c/Users/username/my-project:/app
.Alles funktioniert transparent für Sie.
Dies funktioniert jedoch nicht, wenn sich Ihr Host-Mount-Pfad nicht unter dem
C:\Users
Pfad befindet. Zum Beispiel, wenn Sie das gleichedocker-compose.yml
unter setzenD:\dev\my-project
.Dies kann jedoch leicht behoben werden.
docker-machine stop
).Öffnen Sie die Virtual Box-Benutzeroberfläche, öffnen Sie die Einstellungen der benannten virtuellen Maschine
default
, öffnen Sie denShared Folders
Abschnitt und fügen Sie den neuen freigegebenen Ordner hinzu:D:\dev
d/dev
Drücken Sie
OK
zweimal und schließen Sie die Virtual Box-Benutzeroberfläche.docker-machine start
).Das ist alles. Alle Pfade des Hostcomputers unter
D:\dev
sollten jetzt indocker-compose.yml
Mounts funktionieren .quelle
Es kann getan Hexe Kombination aus drei Tools sein:
docker-machine mount
,rsync
,inotifywait
Nehmen wir an, Sie haben Ihre
docker-compose.yml
undrun_web.sh
in/home/jdcaballerov/web
docker-machine machine:/home/jdcaballerov/web /tmp/some_random_dir
rsync -r /home/jdcaballerov/web /tmp/some_random_dir
Bei jeder Änderung von Dateien in Ihrem Verzeichnis synchronisieren:
ACHTUNG - es gibt zwei Verzeichnisse mit demselben Pfad - eines befindet sich auf Ihrem lokalen (Host-) Computer, das zweite auf einem Docker-Computer.
quelle
Ich gehe davon aus, dass sich die
run_web.sh
Datei im selben Verzeichnis befindet wie Ihredocker-compose.yml
Datei. Dann sollte der Befehl seincommand: /app/run_web.sh
.Es sei denn, das
Dockerfile
(das Sie nicht offenlegen) kümmert sich darum, dierun_web.sh
Datei in das Docker-Image zu legen .quelle
Nachdem Sie die Beiträge hier zusammengefasst haben, fügen Sie ein aktualisiertes Skript hinzu, um beim Neustart von Virtualbox einen zusätzlichen Host-Mount-Punkt und eine automatische Bereitstellung zu erstellen. Die Arbeitsumgebung ist wie folgt kurz: - Windows 7 - docker-machine.exe Version 0.7.0 - VirtualBox 5.0.22
quelle
Ich verwende Docker-Maschine 0.12.2 mit dem Virtualbox-Laufwerk auf meinem lokalen Computer. Ich habe festgestellt, dass es ein Verzeichnis gibt,
/hosthome/$(user name)
von dem aus Sie auf lokale Dateien zugreifen können.quelle
Ich dachte nur, ich würde erwähnen, dass ich 18.03.1-ce-win65 (17513) unter Windows 10 verwendet habe, und ich habe festgestellt, dass, wenn Sie zuvor ein Laufwerk freigegeben und die Anmeldeinformationen zwischengespeichert haben, sobald Sie Ihren Kennwort-Docker geändert haben Die in Containern montierten Volumes sind leer.
Es gibt keinen Hinweis darauf, dass tatsächlich passiert, dass jetzt kein Zugriff auf die mit den alten zwischengespeicherten Anmeldeinformationen freigegebenen Anmeldeinformationen möglich ist. Die Lösung in diesem Szenario besteht darin, die Anmeldeinformationen entweder über die Benutzeroberfläche (Einstellungen-> Freigegebene Laufwerke) zurückzusetzen oder die Laufwerksfreigabe zu deaktivieren und dann neu zu aktivieren und das neue Kennwort einzugeben.
Es wäre nützlich, wenn Docker-Compose in diesen Situationen einen Fehler verursachen würde.
quelle