вступление
Я не могу придумать хороший способ настроить среду разработки на OS X с помощью Docker и Boot2Docker. Проблема, с которой я столкнулся, заключается в том, как управлять исходным кодом, чтобы:
- Я могу изменить код в OS X, используя инструменты (текстовый редактор, IDE, git и т.д.), которые я уже установил.
- Эти изменения отражаются в контейнере Docker, поэтому, если я повторно запускаю тесты или обновляю веб-страницу, я сразу вижу свои изменения.
Теоретически это должно быть легко сделать, установив мой исходный код как том:
docker run -it -v /path/to/my/source/code:/src some-docker-image
К сожалению, у этого есть две основные проблемы, которые делают его полностью непригодным для использования в OS X:
Проблема №1: подключенные тома на VirtualBox (которые используют vboxsf) очень медленные.
Например, вот сколько времени занимает Jekyll, чтобы скомпилировать мою домашнюю страницу, если исходный код является частью образа Docker:
> 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
Вот тот же образ Docker, только на этот раз я монтирую исходный код из 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
Проблема №2: просмотр файлов нарушен
Механизмы наблюдения по умолчанию в SBT, Jekyll и grunt используют такие технологии, как inotify, которые не работают, если они работают в контейнере Docker, а изменения в смонтированной папке вносятся в OS X.
Обходные пути, которые я пробовал
Я искал решения (в том числе все на SO) и опробовал несколько из них, но не нашел успешного:
- Я переключил Boot2Docker на использование NFS , но он был таким же медленным.
- Я попробовал Vagrant + NFS , и он тоже был медленным.
- Я пробовал крепление Samba , но в контейнере Docker папка всегда была пустой.
- Я попытался использовать файловую систему Unison , которая некоторое время работала для синхронизации файлов, но затем продолжала показывать ошибки подключения .
- Я включил опрос в Jekyll , но это значительно увеличило задержку до принятия моих изменений.
- Я попробовал Dinghy , «более быстрый и дружелюбный Docker на OS X с Vagrant» и получил некоторые улучшения. Вместо того, чтобы компиляция Jekyll была в 10-15 раз медленнее, она была в 2-3 раза медленнее. Так лучше, но все еще не совсем удобно.
Кто-нибудь нашел решение, которое действительно работает и позволяет продуктивно разрабатывать код с помощью Docker и OS X?
Обновление: наконец-то решение!
Наконец-то я нашел продуктивное решение с использованием Boot2Docker + rsync. Я собрал подробности того, как это настроить, в моем собственном ответе, а также в проекте с открытым исходным кодом под названием docker-osx-dev .
источник
Ответы:
Я решил добавить свой собственный ответ с лучшим решением, которое я нашел до сих пор. Я обновлю это, если найду лучшие варианты.
Лучшее решение на данный момент
Лучшее решение, которое я нашел для создания продуктивной среды разработки с Docker в OS X, - это Boot2Docker + Rsync . При использовании rsync время сборки в контейнере Docker соответствует времени запуска сборки непосредственно в OSX! Более того, код наблюдателя за файлами не требует опроса (
inotify
работает, поскольку rsync использует обычные папки), поэтому горячая перезагрузка выполняется почти так же быстро.Есть два способа настроить его: автоматическая и ручная.
Автоматическая установка
Я собрал все шаги по настройке Boot2Docker с помощью Rsync в проект с открытым исходным кодом под названием docker-osx-dev . Код немного грубоват, но я успешно использую его в течение нескольких недель, чтобы легко переключаться между 3 проектами с 3 разными техническими стеками. Попробуйте, сообщайте об ошибках и публикуйте PR! Также см. Мое сообщение в блоге «Продуктивная среда разработки с Docker на OS X» для получения дополнительной информации.
Ручная настройка
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
и скопируйте переменные среды, которые он распечатывает, в свой~/.bash_profile
файл.boot2docker ssh "tce-load -wi rsync"
./foo/bar
папку из OS X, вам необходимо создать/foo/bar
на виртуальной машине Boot2Docker: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
. Проверьте в документации по rsync различные настройки, которые вы можете включить, например, использование--exclude .git
для исключения.git
папки при синхронизации.brew install fswatch
), к rsync.docker run
для запуска контейнера Docker и использовать-v
флаг для монтирования папки, которую вы синхронизируете:docker run -v /foo/bar:/src some-docker-image
.inotify
), а сборка должна выполняться быстро, потому что все файлы являются «локальными» для контейнера.boot2docker ip
команду, чтобы узнать, на каком IP он находится.источник
VOLUME
, вы можете предоставить другому контейнеру доступ к этому тому, используя--volumes-from
флаг. Я еще не пробовал, но подозреваю, что это сработает.Обновление : теперь, когда docker для Mac находится в стадии бета-тестирования с функцией, не связанной с взломом, этот путь может быть намного более разумным для локальной разработки без хакерских приемов и обходных путей для эссе.
Не надо . Я знаю, что это не тот ответ, на который вы, вероятно, надеетесь, но честно оцените затраты / выгоды от попытки получить локальный исходный код + выполнение в докере по сравнению с локальной разработкой на OSX.
В какой-то момент все проблемы, усилия по настройке и операционные болевые точки МОГУТ быть решены достаточно хорошо, но на данный момент я считаю, что это чистая потеря.
Подождите немного, и это почти наверняка улучшится.
Я не уверен, что это исправление в ближайшем будущем. Если этот тип функциональности является ключевым для вашего рабочего процесса разработки, я считаю, что это нарушает правила. Это не стоит серьезных исследований и разработок по сравнению с простым использованием rbenv / bundler для управления установками jekyll / ruby и их запуском локально на OSX, как это делали люди в течение последнего десятилетия +.
Точно так же, как "облако" не участвует в моей локальной настройке разработки, на данный момент docker является преимуществом для тестирования / постановки / развертывания и для запуска баз данных и других сторонних компонентов, но приложения, которые я кодирую, запускаются прямо на OSX.
источник
Docker для Mac и Windows должен стать окончательным способом разработки с помощью Docker в OS X (и Windows). Программное обеспечение Docker представляет собой «интегрированную, простую в развертывании среду для создания, сборки и доставки приложений с Mac или Windows». Предполагается, что он сможет решить проблемы, представленные ОП. Из объявления от 24 марта 2016 г . :
источник
Отказ от ответственности: я могу быть предвзятым, так как я автор docker-sync.
Я, вероятно, пробовал все решения, названные здесь, в том числе некоторые другие (см. Сравнение https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), но они в основном либо потерпели неудачу на стороне производительность (большинство из них) или на докер-машине (или ни одной) используется / применяется.
http://docker-sync.io был создан для объединения всех решений и предоставления лучших стратегий (реализация нескольких, вы можете выбрать).
Его можно использовать с rsync (односторонняя синхронизация), включая исправления разрешений для пользователей, и с unison (двухсторонняя синхронизация). Он не заставляет вас использовать докер-машину или конкретный гипервизор, а также не требует наличия докера для Mac. Он работает со всеми из них.
На производительность EugenMayer / docker-sync / wiki / 4.-На производительность не влияет, как будто у вас вообще нет акций.
docker-sync и его наблюдатели за изменениями оптимизированы и без проблем работают с проектами с 12К файлами.
Попробуйте, если хотите, я хотел бы услышать отзывы!
источник
Я чувствую тебя! Думаю, я перепробовал почти все, что вы пробовали, но, к сожалению, все было медленно. Затем я наткнулся на этот комментарий https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254, который предлагает использовать Vagrant и Parallels вместо Virtualbox. Это позволило мне использовать nfs, и я действительно увидел большой прирост производительности моего проекта (Drupal).
Вот файл Vagrant. Все, что вам нужно сделать, это установить vagrant, скопировать его в файл с именем Vagrantfile и поместить в какую-нибудь папку. Перейдите в эту папку и просто
vagrant up
запустите вместо обычного boot2docker.источник
Я также использую Vagrant с параллелями и boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Для меня разработка никогда не была такой простой. Очень хорошо работает с
docker-compose
большими установками. Я действительно не чувствую задержки или массового потребления ресурсов.Вот как
Vagrantfile
выглядит мой :источник
Я занимаюсь разработкой в среде OS X (Macbook Air середины 2011 года) + Boot2Docker + Docker-compose в течение нескольких недель. Я не сталкивался с серьезными проблемами с производительностью, но я избегаю запуска каких-либо сборок при разработке (почему бы не использовать что-то вроде
jekyll serve --skip-initial-build
?). Вот примерdocker-compose.yml
файла, который я использую:docker-compose.yml:
Dockerfile:
Иногда я использую NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), но не заметил большой разницы в производительности при этом.
Для меня удобство простого
docker-compose up test
запуска моей среды окупилось затрат на производительность (я обычно работаю над несколькими проектами с разными стеками).PS:
nodemon
это один из немногих наблюдателей за файлами, который работает с vboxsf (см. Https://github.com/remy/nodemon/issues/419 ).источник
Docker Unison работает как шарм! https://github.com/leighmcculloch/docker-unison
Двунаправленная синхронизация с очень хорошей производительностью!
источник
Заставить докер работать как инструмент разработки возможно. Но будет больно. Я задокументировал этот процесс здесь:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
источник
Этот метод является последним (сентябрь 2015 г.) и самым простым способом установить Docker на Mac: ссылка здесь:
Вы устанавливаете Docker с помощью Docker Toolbox, ссылка на инструкции здесь:
Это полный пакет установки Docker, который включает следующие инструменты Docker:
Docker Machine для запуска двоичного файла docker-machine
Docker Engine для запуска двоичного файла докера
Docker Compose для запуска двоичного файла docker-compose
Kitematic, графический интерфейс Docker, оболочка, предварительно настроенная для среды командной строки Docker.
Oracle VM VirtualBox
Что в панели инструментов:
источник