Intro
Nie mogę znaleźć dobrego sposobu na skonfigurowanie środowiska programistycznego na OS X przy użyciu Dockera i Boot2Dockera. Problem, który napotykam, polega na tym, jak zarządzać kodem źródłowym, aby:
- Mogę modyfikować kod na OS X używając narzędzi (edytor tekstu, IDE, git itp.), Które już zainstalowałem.
- Te modyfikacje są odzwierciedlane w kontenerze Docker, więc jeśli ponownie uruchomię testy lub odświeżę stronę internetową, mogę natychmiast zobaczyć swoje zmiany.
W teorii powinno to być łatwe do zrobienia, montując mój kod źródłowy jako wolumin:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Niestety ma to dwa główne problemy, które sprawiają, że jest całkowicie bezużyteczny w systemie OS X:
Problem nr 1: Zamontowane woluminy w VirtualBox (które używają vboxsf) są bardzo wolne
Na przykład, oto ile czasu zajmuje Jekyll skompilowanie mojej strony głównej, jeśli kod źródłowy jest częścią obrazu Dockera:
> 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
Oto dokładnie ten sam obraz Dockera, z wyjątkiem tego, że montuję kod źródłowy z OS X:
> 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
Kwestia # 2: Oglądanie plików jest zepsute
Domyślne mechanizmy nadzoru w SBT, Jekyll i grunt używają technologii, takich jak inotify, które nie działają, jeśli działają w kontenerze Docker, a zmiany są wprowadzane w systemie OS X do zamontowanego folderu.
Rozwiązania, które próbowałem
Szukałem rozwiązań (w tym wszystkich na SO) i wypróbowałem kilka z nich, ale nie znalazłem udanego:
- I przełączane Boot2Docker używać NFS , ale to było tak powolny.
- Wypróbowałem Vagrant + NFS i było to równie powolne.
- Wypróbowałem wierzchowca Samby , ale folder zawsze był pusty w kontenerze Dockera.
- Próbowałem użyć systemu plików Unison , który działał przez chwilę, aby zsynchronizować pliki, ale potem wyświetlał błędy połączenia .
- Włączyłem odpytywanie w Jekyll , ale to znacznie zwiększyło opóźnienie, zanim moje zmiany zostaną odebrane.
- Wypróbowałem Dinghy , „szybszy, bardziej przyjazny Docker na OS X z Vagrantem” i uzyskałem pewną poprawę. Kompilacja Jekyll nie była 10-15x wolniejsza, ale 2-3 razy wolniejsza. Tak jest lepiej, ale nadal nie do końca nadaje się do użytku.
Czy ktoś znalazł rozwiązanie, które faktycznie działa i pozwala produktywnie tworzyć kod za pomocą Dockera i OS X?
Aktualizacja: w końcu rozwiązanie!
W końcu znalazłem rozwiązanie, które wydaje się produktywne przy użyciu Boot2Docker + rsync. Uchwyciłem szczegóły, jak to ustawić, w mojej własnej odpowiedzi, a także w projekcie open source o nazwie docker-osx-dev .
źródło
Odpowiedzi:
Postanowiłem dodać własną odpowiedź z najlepszym rozwiązaniem, jakie do tej pory znalazłem. Zaktualizuję to, jeśli znajdę lepsze opcje.
Jak dotąd najlepsze rozwiązanie
Najlepszym rozwiązaniem, jakie znalazłem do skonfigurowania produktywnego środowiska programistycznego z Dockerem na OS X, jest: Boot2Docker + Rsync . Dzięki rsync czasy kompilacji w kontenerze Dockera są takie same, jak uruchamianie kompilacji bezpośrednio w systemie OSX! Co więcej, kod obserwatora plików to robi nie wymaga odpytywania (
inotify
działa, ponieważ rsync używa normalnych folderów), więc ponowne ładowanie na gorąco jest prawie tak samo szybkie.Istnieją dwa sposoby konfiguracji: instalacja automatyczna i instalacja ręczna.
Instalacja automatyczna
Spakowałem wszystkie kroki konfiguracji Boot2Docker z Rsync do projektu open source o nazwie docker-osx-dev . Kod jest nieco szorstki, ale z powodzeniem używam go przez kilka tygodni, aby łatwo przełączać się między 3 projektami z 3 różnymi stosami technologii. Wypróbuj, zgłoś błędy i prześlij kilka PR! Zobacz także mój wpis na blogu, Produktywne środowisko programistyczne z Dockerem w systemie OS X, aby uzyskać więcej informacji.
Manualna instalacja
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
i skopiuj zmienne środowiskowe, które drukuje, do~/.bash_profile
pliku.boot2docker ssh "tce-load -wi rsync"
./foo/bar
folder z OS X, musisz utworzyć/foo/bar
na 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
. Sprawdź dokumenty rsync pod kątem różnych ustawień, które możesz chcieć włączyć, takich jak użycie--exclude .git
do wykluczenia.git
folderu podczas synchronizacji.brew install fswatch
) przesłanego potokiem do rsync.docker run
uruchomić kontener Docker i użyć-v
flagi, aby zamontować synchronizowany folder:docker run -v /foo/bar:/src some-docker-image
.inotify
), a kompilacja powinna przebiegać szybko, ponieważ wszystkie pliki są „lokalne” w kontenerze.boot2docker ip
polecenie, aby dowiedzieć się, na jakim adresie IP się ona znajduje.źródło
VOLUME
, możesz dać innemu kontenerowi dostęp do tego woluminu za pomocą--volumes-from
flaga. Jeszcze tego nie próbowałem, ale podejrzewam, że to zadziała.Aktualizacja : Teraz, gdy Docker dla Maca jest w wersji beta z funkcjonalnością niezwiązaną z hackowaniem, pójście tą drogą może być o wiele bardziej rozsądne w przypadku lokalnego rozwoju bez hacków i obejść eseju.
Nie . Wiem, że to nie jest odpowiedź, na którą prawdopodobnie liczysz, ale weź uczciwą ocenę kosztów / korzyści próby uzyskania lokalnego kodu źródłowego + dokeryzowanego wykonywania, a nie tylko lokalnego programowania na OSX.
W pewnym momencie wszystkie problemy, wysiłek związany z konfiguracją i problemy operacyjne MOGĄ zostać rozwiązane wystarczająco dobrze, ale w tej chwili uważam, że to strata netto.
Poczekaj chwilę, a to prawie na pewno się poprawi.
Nie jestem pewien, czy można to naprawić w najbliższej przyszłości. Jeśli tego typu funkcjonalność jest kluczowa dla Twojego przepływu pracy, uznałbym to za przełamanie transakcji. Nie jest to warte większego wysiłku badawczo-rozwojowego w porównaniu do zwykłego używania rbenv / bundler do zarządzania instalacjami jekyll / ruby i uruchamiania ich lokalnie na OSX, tak jak ludzie z powodzeniem robili przez ostatnią dekadę +.
Tak jak „chmura” nie angażuje się w moje lokalne ustawienia programistyczne, w tej chwili docker jest zwycięzcą w zakresie testowania / przemieszczania / wdrażania oraz uruchamiania baz danych i innych komponentów stron trzecich, ale aplikacje, które faktycznie koduję, działają od razu na OSX.
źródło
Docker dla Mac i Windows będzie ostatecznym sposobem programowania z Dockerem na OS X (i Windows). Oprogramowanie Docker to „zintegrowane, łatwe do wdrożenia środowisko do tworzenia, składania i wysyłania aplikacji z komputerów Mac lub Windows”. Ma rzekomo być w stanie rozwiązać problemy przedstawione przez PO. Od ogłoszenia z 24 marca 2016 r . :
źródło
Zastrzeżenie: Mogę być stronniczy, ponieważ jestem autorem docker-sync.
Prawdopodobnie wypróbowałem wszystkie wymienione tutaj rozwiązania, w tym kilka innych (patrz kompilacja https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), ale w zasadzie albo zawiodły po stronie wydajność (większość z nich) lub na maszynie dokującej (lub żadna) używana / wymuszona.
http://docker-sync.io został zbudowany, aby połączyć wszystkie rozwiązania i zapewnić najlepsze strategie (wdrażając kilka, możesz wybrać).
Może być używany z rsync (synchronizacja jednokierunkowa), w tym poprawki uprawnień dla użytkowników, oraz z unison (synchronizacja dwukierunkowa). Nie zmusza cię to do dokowania maszyny lub określonego hiperwizora, ani nie wymaga posiadania dockera dla Maca. Działa z każdym z nich.
Wydajność EugenMayer / docker-sync / wiki / 4.-Performance nie ma wpływu, to tak, jakbyś nie miał żadnych udziałów.
docker-sync i jego obserwatory zmian są zoptymalizowane i bezproblemowo pracują z projektami z plikami 12k.
Spróbuj, jeśli chcesz, z chęcią poznam Twoją opinię!
źródło
Czuję Cię! Myślę, że próbowałem prawie wszystkiego, czego próbowałeś i niestety nadal było to powolne. Potem natknąłem się na ten komentarz https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254, który sugeruje użycie Vagrant i Parallels zamiast Virtualbox. Pozwoliło mi to na użycie nfs i rzeczywiście zauważyłem duży wzrost wydajności mojego projektu (Drupal).
Oto plik Vagranta. Wszystko, co musisz zrobić, to zainstalować vagrant, skopiować to do pliku o nazwie Vagrantfile i umieścić w jakimś folderze. Przejdź do tego folderu i po prostu zrób
vagrant up
zamiast normalnego boot2dockera.źródło
Używam również Vagrant z paralelami i boot2dockerem ( https://github.com/Parallels/boot2docker-vagrant-box ). Rozwój nigdy nie był dla mnie łatwiejszy. Działa naprawdę dobrze z
docker-compose
dużymi konfiguracjami. Naprawdę nie odczuwam opóźnienia ani ogromnego zużycia zasobów.Tak
Vagrantfile
wygląda mój wygląd:źródło
Od kilku tygodni pracuję w środowisku OS X (Macbook Air z połowy 2011 r.) + Boot2Docker + Docker-compose. Nie napotkałem poważnych problemów z wydajnością, ale unikam uruchamiania jakiejkolwiek kompilacji podczas programowania (dlaczego nie użyć czegoś takiego
jekyll serve --skip-initial-build
?). Oto przykładowydocker-compose.yml
plik, którego używam:docker-compose.yml:
Dockerfile:
Czasami używam NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), ale nie zauważyłem dużej różnicy w wydajności.
Dla mnie wygoda prostego
docker-compose up test
uruchomienia mojego środowiska była warta swojej wydajności (rutynowo pracuję nad wieloma projektami z różnymi stosami).PS:
nodemon
jest jednym z niewielu obserwatorów plików, który współpracuje z vboxsf (patrz https://github.com/remy/nodemon/issues/419 ).źródło
Docker Unison działa jak marzenie! https://github.com/leighmcculloch/docker-unison
Dwukierunkowa synchronizacja z bardzo dobrą wydajnością!
źródło
Uruchomienie dockera jako narzędzia programistycznego jest możliwe. Ale to będzie bolało. Udokumentowałem ten proces tutaj:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
źródło
Ta metoda jest najnowszym (wrzesień 2015 r.) I najłatwiejszym sposobem na uzyskanie konfiguracji Dockera na komputerze Mac: łącze tutaj:
Instalujesz Docker za pomocą linku Docker Toolbox do instrukcji tutaj:
Jest to kompletny pakiet instalacyjny Dockera, platformy Docker który zawiera następujące narzędzia platformy Docker:
Docker Machine do uruchamiania pliku binarnego docker-machine
Docker Engine do uruchamiania pliku binarnego Docker
Docker Compose do uruchamiania pliku binarnego Docker-Compose
Kitematic, graficzny interfejs użytkownika platformy Docker, powłoka wstępnie skonfigurowana dla środowiska wiersza polecenia Dockera
Oracle VM VirtualBox
Co znajduje się w zestawie narzędzi:
źródło