Ok, es gibt ein paar Punkte, die hier angesprochen werden müssen.
Beginnen wir damit, was ein Docker-Volume ist (Versuchen Sie, an dieser Stelle nicht an Ihr Macbook oder die vagabundierende Maschine zu denken. Denken Sie nur daran, dass die Docker ein anderes Dateisystem verwenden, wo immer es sich an dieser Stelle befindet):Vielleicht stellen Sie sich das vor So ist jedes Volume in Docker an und für sich nur ein Teil des internen Dateisystems, das Docker verwendet. Die Container können diese Volumes verwenden, als wären sie "kleine Festplatten", die von ihnen gemountet und auch zwischen ihnen geteilt werden können ( oder von zwei von ihnen gleichzeitig gemountet werden, wie das Mounten einer superschnellen Version eines FTP-Servers auf zwei Clients oder was auch immer :P ).
Im Prinzip können Sie diese Volumes (immer noch nicht an Ihren Computer/Vagabunden selbst denken, nur die Docker;) ) über die VOLUME-Anweisung der Dockerfile deklarieren. Standardbeispiel, führen Sie einen Webserver-Container wie folgt aus:
FROM: nginx
VOLUME /www
Jetzt kann theoretisch alles, was in /www geht, in einem Container gemountet und unmountet werden und auch in mehreren Containern gemountet werden. Jetzt ist Nginx allein langweilig, also wollen wir, dass PHP die Dateien durchläuft, die Nginx speichert, um etwas mehr Spaß zu erzeugen. => Wir müssen dieses Volume in einen php-fpm-Container einhängen. Ergo würden wir dies in unserer Compose-Datei tun
web:
image: nginx
php:
image: php-fpm
volumes_from:
- web
=> voila! Jeder Ordner, der durch eine VOLUME-Direktive im nginx/web-Container deklariert wird, ist im PHP-Container sichtbar. Wichtiger Punkt, der hier zu beachten ist, was auch immer in nginx's /www ist, wird alles überschreiben, was php in /www hat. Wenn Sie das :ro setzen, kann php nicht einmal in diesen Ordner schreiben :)
Wenn Sie sich Ihrem Problem nähern, gibt es eine zweite Möglichkeit, Volumes zu deklarieren, bei der sie nicht in der Dockerfile deklariert werden müssen. Dies kann durch das Mounten von Volumes vom Host (in diesem Fall Ihr vagrant/boo2docker-Ding) erfolgen. Lassen Sie uns dies zunächst so diskutieren, als würden wir ein natives Linux verwenden.
Wenn Sie so etwas schreiben würden:
volumes:
- /home/myuser/folder:/folder
in Ihrer docker-compose.yml, bedeutet dies, dass /home/myuser/folder nun in den Docker gemountet wird. Es überschreibt alles, was der Docker in /folder hat, und ist genau wie das /www auch von dem Ding aus zugänglich, das es deklariert hat. Jetzt läuft der Linux-Rechner, auf dem der Docker-Daemon läuft.
So viel zur Theorie :), tatsächlich brauchst du wahrscheinlich nur die folgenden Ratschläge, um deine Sachen zum Laufen zu bringen :):
Die Art und Weise, wie boot2docker/docker-machine/kitematic und all diese Dinge mit dem Problem umgehen, ist einfach, dass sie zunächst nur ein Volume in der vagabundierenden Maschine in die Docker-Container einhängen und dieses Ding einfach auch in Ihr Mac-Dateisystem einhängen , in der Hoffnung, dass alles klappt :P
Nun zum praktischen Problem, mit dem wir alle, die dies verwenden (oder einfach nur versuchen, ihren Kollegen in die Welt des süßen Docker :P zu helfen), auf dem Mac konfrontiert sind, mit Berechtigungen. Ich meine, denken Sie darüber nach (Root oder ein anderer Benutzer verarbeitet Dateien im Container, der Benutzer Vagrant verarbeitet möglicherweise Dateien im Vagrant-Host und dann verarbeitet Ihr Mac-Benutzer "skalfyfan" diese Dateien auf dem Mac. Sie haben alle unterschiedliche Benutzer-IDs und so weiter => Daraus ergeben sich viele Probleme, und das hängt davon ab, was Sie tatsächlich in Docker ausführen.Mysql und Apache sind besonders schmerzhaft, da sie nicht als Root innerhalb des Containers ausgeführt werden.Das heißt, sie haben oft Probleme, in die Mac-Datei zu schreiben System.
Bevor Sie den zweiten Ansatz unten ausprobieren, versuchen Sie einfach, Ihre Container-Volumes unter Ihrem Mac-Home-Verzeichnis abzulegen. Dies wird in den meisten Fällen Probleme mit MySQL lösen, wie ich im Laufe der Zeit festgestellt habe. Übrigens:Es ist nicht erforderlich, vollständige Pfade zu Volumes anzugeben. stark>
Legen Sie einfach das compose-yml in Ihren Mac-Benutzerordner, das ist alles, was zählt. Kein chmod 777 -R :P wird dir hier helfen, es muss sich nur in deinem Home-Ordner befinden :)
Dennoch werden einige Apps (z. B. Apache) Ihnen das Leben schwer machen. Die Tatsache, dass sich die Benutzer-ID von allem, was im Container läuft, von Ihrer Mac-Benutzer-ID unterscheidet, wird Ihnen das Leben zur Hölle machen. Um dies zu umgehen, müssen Sie die Benutzer-ID sowie die Benutzergruppe so anpassen, dass sie nicht mit den Berechtigungen Ihres Macs kollidieren. Die gewünschte Gruppe auf einem Mac ist staff, eine UID, die funktioniert, wäre zum Beispiel 1000. Daher könnten Sie dies an das Ende Ihrer Docker-Datei schreiben:
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
oder
RUN usermod -u 1000 mysql
RUN usermod -G staff mysql
Also, wie Sie jetzt gelernt haben:
Richtig, das tut es :)
Diesen haben Sie falsch verstanden :) Wie bereits erläutert, wird Docker diesen Pfad beibehalten, wenn Sie keinen Hostordner angeben. Aber nur für diesen Container und alle bleiben im Docker-Dateisystem. Es wird überhaupt nichts an den Host geschrieben! Dies geschieht immer nur, wenn Sie vor dem Container-Ordner einen Host-Ordner angeben!
Hoffe das hat geholfen :)