介绍
我想不出一种使用Docker和Boot2Docker在OS X上设置开发环境的好方法。我遇到的问题是如何管理源代码,以便:
- 我可以使用已经安装的工具(文本编辑器,IDE,git等)在OS X上修改代码。
- 这些修改反映在Docker容器中,因此,如果我重新运行测试或刷新网页,则可以立即看到所做的更改。
从理论上讲,通过将我的源代码安装为一个卷可以很容易地做到这一点:
docker run -it -v /path/to/my/source/code:/src some-docker-image
不幸的是,这有两个主要问题,使其在OS X上完全无法使用:
问题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中启用了轮询功能,但这大大增加了延迟,直到我的更改被提取为止。
- 我尝试了Dinghy,它是“在带有Vagrant的OS X上更快,更友好的Docker”,并得到了一些改进。Jekyll的编译速度要慢2-3倍,而不是Jekyll慢10-15倍。更好,但仍然不太实用。
有没有人找到一个切实可行的解决方案,并允许您使用Docker和OS X高效地开发代码?
更新:终于解决了!
我终于找到了一个使用Boot2Docker + rsync似乎很有成效的解决方案。我已经在我自己的答案以及一个名为docker-osx-dev的开源项目中捕获了有关如何进行设置的详细信息。