Intro
Ich kann keinen guten Weg finden, um eine Entwicklungsumgebung unter OS X mit Docker und Boot2Docker einzurichten. Das Problem, auf das ich stoße, ist, wie der Quellcode so verwaltet wird, dass:
- Ich kann den Code unter OS X mit den bereits installierten Tools (Texteditor, IDE, Git usw.) ändern.
- Diese Änderungen werden im Docker-Container angezeigt. Wenn ich also Tests erneut ausführe oder eine Webseite aktualisiere, kann ich meine Änderungen sofort sehen.
Theoretisch sollte dies einfach sein, indem Sie meinen Quellcode als Volume bereitstellen:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Leider hat dies zwei Hauptprobleme, die es unter OS X völlig unbrauchbar machen:
Problem Nr. 1: Bereitgestellte Volumes auf VirtualBox (die vboxsf verwenden) sind extrem langsam
Hier ist zum Beispiel, wie lange Jekyll braucht, um meine Homepage zu kompilieren, wenn der Quellcode Teil des Docker-Images ist:
> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash
root@7aaea30d98a1:/src# time bundle exec jekyll build
[...]
real 0m7.879s
user 0m7.360s
sys 0m0.600s
Hier ist genau das gleiche Docker-Image, außer dass ich diesmal den Quellcode von OS X einbinde:
> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash
root@1521b0b4ce6a:/src# time bundle exec jekyll build
[...]
real 1m14.701s
user 0m9.450s
sys 0m3.410s
Problem Nr. 2: Die Dateiüberwachung ist fehlerhaft
Die Standardüberwachungsmechanismen in SBT, Jekyll und Grunt verwenden Technologien wie inotify, die nicht funktionieren, wenn sie in einem Docker-Container ausgeführt werden und die Änderungen in OS X an einem bereitgestellten Ordner vorgenommen werden.
Problemumgehungen Ich habe es versucht
Ich habe nach Lösungen gesucht (einschließlich aller auf SO) und einige davon ausprobiert, aber keine erfolgreiche gefunden:
- Ich habe Boot2Docker auf NFS umgestellt , aber es war genauso langsam.
- Ich habe Vagrant + NFS ausprobiert , und das war auch genauso langsam.
- Ich habe versucht, ein Samba-Mount zu verwenden , aber der Ordner wurde im Docker-Container immer leer angezeigt.
- Ich habe versucht, das Unison-Dateisystem zu verwenden , das kurz zum Synchronisieren von Dateien diente, dann aber weiterhin Verbindungsfehler zeigte .
- Ich habe die Abfrage in Jekyll aktiviert , aber das hat die Verzögerung erheblich erhöht, bis meine Änderungen übernommen wurden.
- Ich habe Dinghy ausprobiert , einen "schnelleren, freundlicheren Docker unter OS X mit Vagrant" und einige Verbesserungen erzielt. Anstatt dass die Jekyll-Kompilierung 10-15x langsamer war, war sie 2-3x langsamer. Das ist besser, aber immer noch nicht ganz brauchbar.
Hat jemand eine Lösung gefunden, die tatsächlich funktioniert und es Ihnen ermöglicht, Code mit Docker und OS X produktiv zu entwickeln?
Update: endlich eine Lösung!
Ich habe endlich eine Lösung gefunden, die mit Boot2Docker + rsync produktiv erscheint. Ich habe die Details zum Einrichten in meiner eigenen Antwort sowie in einem Open-Source-Projekt namens docker-osx-dev festgehalten .
quelle
Antworten:
Ich habe beschlossen, meine eigene Antwort mit der besten Lösung hinzuzufügen, die ich bisher gefunden habe. Ich werde dies aktualisieren, wenn ich bessere Optionen finde.
Beste Lösung bisher
Die beste Lösung, die ich zum Einrichten einer produktiven Entwicklungsumgebung mit Docker unter OS X gefunden habe, ist: Boot2Docker + Rsync . Mit rsync entsprechen die Build-Zeiten in einem Docker-Container der Ausführung des Builds direkt unter OSX! Darüber hinaus muss der Dateiüberwachungscode nicht abgefragt werden (
inotify
funktioniert, da rsync normale Ordner verwendet), sodass das Hot-Reload fast genauso schnell ist.Es gibt zwei Möglichkeiten, es einzurichten: eine automatisierte Installation und eine manuelle Installation.
Automatisierte Installation
Ich habe alle Schritte zum Einrichten von Boot2Docker mit Rsync in ein Open Source-Projekt namens docker-osx-dev gepackt . Der Code ist etwas rau, aber ich benutze ihn seit mehreren Wochen erfolgreich, um einfach zwischen 3 Projekten mit 3 verschiedenen Tech-Stacks zu wechseln. Probieren Sie es aus, melden Sie Fehler und reichen Sie einige PRs ein! Siehe auch meinen Blog-Beitrag,Weitere Informationen finden Eine produktive Entwicklungsumgebung mit Docker unter OS X.
Manuelle Einrichtung
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
die Umgebungsvariablen aus und kopieren Sie sie in Ihre~/.bash_profile
Datei.boot2docker ssh "tce-load -wi rsync"
./foo/bar
Ordner unter OS X synchronisieren , müssen Sie ihn erstellen/foo/bar
Folgendes auf der Boot2Docker-VM :boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
.rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
. Überprüfen Sie die rsync-Dokumente auf verschiedene Einstellungen, die Sie möglicherweise aktivieren möchten, z. B.--exclude .git
zum Ausschließen von.git
Ordners bei der Synchronisierung.brew install fswatch
) verwenden, das in rsync geleitet wird.docker run
Ihren Docker-Container zu starten und das-v
Flag zum Mounten des zu synchronisierenden Ordners zu verwenden:docker run -v /foo/bar:/src some-docker-image
.inotify
) und der Build sollte schnell ausgeführt werden, da alle Dateien im Container "lokal" sind.boot2docker ip
Befehl aus, um herauszufinden, auf welcher IP sie sich befindet.quelle
VOLUME
, können Sie einem anderen Container mithilfe von den Zugriff auf dieses Volume gewähren--volumes-from
Flagge. Ich habe das noch nicht versucht, aber ich vermute, es würde funktionieren.Update : Jetzt, da Docker für Mac in der Beta-Phase mit Nicht-Hack-Funktionalität ist, ist dieser Weg für die lokale Entwicklung möglicherweise viel vernünftiger, ohne dass ein Aufsatz Hacks und Problemumgehungen enthält.
Tu es nicht . Ich weiß, dass dies nicht die Antwort ist, auf die Sie wahrscheinlich hoffen, aber nehmen Sie eine ehrliche Bewertung der Kosten / Nutzen des Versuchs, lokalen Quellcode + Docker-Ausführung zu erhalten, anstatt nur lokale Entwicklung unter OSX durchzuführen.
Irgendwann können alle Probleme, Einrichtungsaufwand und betrieblichen Schwachstellen gut genug gelöst werden, aber ab sofort ist dies ein Nettoverlust.
Warten Sie eine Weile und dies wird sich mit ziemlicher Sicherheit verbessern.
Ich bin mir nicht sicher, ob dies in naher Zukunft behoben werden kann. Wenn diese Art von Funktionalität der Schlüssel zu Ihrem Entwicklungsworkflow ist, würde ich dies als Dealbreaker betrachten. Es ist keine große Forschungs- und Entwicklungsarbeit wert, wenn man nur rbenv / bundler verwendet, um Ihre Jekyll / Ruby-Installationen zu verwalten und lokal unter OSX auszuführen, wie es die Leute in den letzten zehn Jahren erfolgreich gemacht haben.
Genau wie "die Cloud" an meinem lokalen Entwicklungssetup nicht beteiligt ist, ist Docker im Moment ein Gewinn für das Testen / Staging / Bereitstellen und für das Ausführen von Datenbanken und anderen Komponenten von Drittanbietern, aber die Anwendungen, die ich tatsächlich codiere, werden direkt ausgeführt unter OSX.
quelle
Docker für Mac und Windows soll die endgültige Entwicklungsmethode mit Docker unter OS X (und Windows) sein. Als Docker-Produkt ist die Software eine „integrierte, einfach zu implementierende Umgebung zum Erstellen, Zusammenstellen und Versenden von Anwendungen von Mac oder Windows“. Es soll in der Lage sein, die vom OP gestellten Probleme lösen zu können. Aus der Ankündigung vom 24. März 2016 :
quelle
Haftungsausschluss: Ich bin möglicherweise voreingenommen, da ich der Autor von Docker-Sync bin.
Ich habe wahrscheinlich alle hier genannten Lösungen ausprobiert, einschließlich einiger weiterer (siehe die Version https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), aber sie sind im Grunde entweder auf der Seite von fehlgeschlagen Leistung (die meisten von ihnen) oder auf der Docker-Maschine (oder keine) verwendet / erzwungen.
http://docker-sync.io wurde entwickelt, um alle Lösungen zusammenzuführen und die besten Strategien bereitzustellen (Implementierung mehrerer, können Sie wählen).
Es kann mit rsync (1-Wege-Synchronisierung) einschließlich Berechtigungskorrekturen für Benutzer und mit unisono (2-Wege-Synchronisierung) verwendet werden. Es zwingt Sie weder zu einer Docker-Maschine oder einem bestimmten Hypervisor, noch erfordert es, dass Sie Docker für Mac haben. Es funktioniert mit allen.
Die Leistung von EugenMayer / docker-sync / wiki / 4.-Performance wird nicht beeinflusst, es ist, als hätten Sie überhaupt keine Freigaben.
Docker-Sync und seine Change-Watcher sind optimiert und arbeiten problemlos mit Projekten mit 12k-Dateien.
Probieren Sie es aus, wenn Sie möchten, würde ich gerne Feedback hören!
quelle
Ich kann das gut nachfühlen! Ich glaube, ich habe so ziemlich alles versucht, was du versucht hast, und leider war es immer noch langsam. Dann bin ich auf diesen Kommentar https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 gestoßen , der die Verwendung von Vagrant und Parallels anstelle von Virtualbox vorschlägt. Dies erlaubte mir, nfs zu verwenden, und ich sah tatsächlich einen großen Leistungsschub für mein Projekt (Drupal).
Hier ist die Vagrant-Datei. Alles, was Sie tun müssen, ist, vagrant zu installieren, dies in eine Datei namens Vagrantfile zu kopieren und in einem Ordner abzulegen. Gehen Sie zu diesem Ordner und führen Sie
vagrant up
statt Ihres normalen boot2docker einfach einen aus.quelle
Ich verwende Vagrant auch mit Parallelen und boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Die Entwicklung war für mich nie einfacher. Funktioniert sehr gut mit
docker-compose
und großen Setups. Ich spüre keine Verzögerung oder keinen massiven Ressourcenverbrauch.So
Vagrantfile
sieht mein aus:quelle
Ich entwickle seit einigen Wochen in einer OS X (Mitte 2011 Macbook Air) + Boot2Docker + Docker-Compose-Umgebung. Ich habe keine größeren Leistungsprobleme festgestellt, aber ich vermeide es, bei der Entwicklung Builds auszuführen (warum nicht so etwas verwenden
jekyll serve --skip-initial-build
?). Hier ist eine Beispieldateidocker-compose.yml
, die ich verwende:docker-compose.yml:
Dockerfile:
Ich verwende manchmal NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), habe dabei aber keinen großen Leistungsunterschied festgestellt.
Für mich ist die Bequemlichkeit eines einfachen
docker-compose up test
zu betriebsbereiten Umgebung die Kosten für die Leistung wert (ich arbeite routinemäßig an mehreren Projekten mit unterschiedlichen Stapeln).PS:
nodemon
ist einer der wenigen Datei-Watcher, die mit vboxsf arbeiten (siehe https://github.com/remy/nodemon/issues/419 ).quelle
Docker Unison wirkt wie ein Zauber! https://github.com/leighmcculloch/docker-unison
Bidirektionale Synchronisation mit einer sehr guten Leistung!
quelle
Es ist möglich, Docker als Entwicklungswerkzeug zum Laufen zu bringen. Aber es wird weh tun. Ich habe den Prozess hier dokumentiert:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
quelle
Diese Methode ist die neueste (September 2015) und einfachste Möglichkeit, Docker auf dem Mac einzurichten: Link hier:
Sie installieren Docker über den Docker Toolbox- Link zu den folgenden Anweisungen:
Es handelt sich um ein vollständiges Docker-Setup-Paket, das die folgenden Docker-Tools enthält:
Docker-Maschine zum Ausführen der Docker-Maschine-Binärdatei
Docker Engine zum Ausführen der Docker-Binärdatei
Docker Compose zum Ausführen der Docker-Compose-Binärdatei
Kitematisch ist die Docker-GUI eine Shell, die für eine Docker-Befehlszeilenumgebung vorkonfiguriert ist
Oracle VM VirtualBox
Was ist in der Toolbox:
quelle