はじめに
DockerとBoot2Dockerを使用してOS Xで開発環境をセットアップする良い方法がわかりません。私が直面している問題は、次のようにソースコードを管理する方法です。
- インストール済みのツール(テキストエディター、IDE、gitなど)を使用して、OS Xのコードを変更できます。
- これらの変更はDockerコンテナーに反映されるため、テストを再実行したり、Webページを更新したりすると、変更をすぐに確認できます。
理論的には、これはソースコードをボリュームとしてマウントすることで簡単に実行できるはずです。
docker run -it -v /path/to/my/source/code:/src some-docker-image
残念ながら、これにはOS Xで完全に使用できなくなる2つの主要な問題があります。
問題#1:VirtualBox(vboxsfを使用)にマウントされたボリュームが非常に遅い
たとえば、ソースコードがDockerイメージの一部である場合、Jekyllが私のホームページをコンパイルするのにかかる時間は次のとおりです。
> 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でポーリングを有効にしましたが、変更が反映されるまでの遅延が大幅に増加しました。
- 私は「Vagrantを使用したOS Xでより速く、よりフレンドリーなDocker」であるDinghyを試してみて、いくつかの改善を得ました。Jekyllのコンパイルが10〜15倍遅くなる代わりに、2〜3倍遅くなりました。それはより良いですが、まだ完全に使用可能ではありません。
実際に機能し、DockerとOS Xを使用してコードを生産的に開発できるソリューションを誰かが見つけましたか?
更新:ついに解決策!
私はようやくBoot2Docker + rsyncを使用して生産的に見えるソリューションを見つけました。これを自分の回答で設定する方法の詳細と、docker-osx-devと呼ばれるオープンソースプロジェクトをキャプチャしました。