简介
我无法想出一种在OS X上使用Docker和Boot2Docker设置开发环境的好方法。 我遇到的问题是如何管理源代码,以便:
- 我可以使用已安装的工具(文本编辑器、IDE、git等)在OS X上修改代码。
- 这些修改会反映在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 上对挂载的文件夹进行时,这些技术将无法正常工作。
我尝试过的解决方法
我搜索了各种解决方案(包括 Stack Overflow 上的所有方案)并尝试了其中几个,但都没有找到成功的方法:
- 我切换了 Boot2Docker 以使用 NFS,但速度仍然很慢。
- 我尝试使用Vagrant + NFS,但速度仍然很慢。
- 我尝试过Samba 挂载,但 Docker 容器中的文件夹总是显示为空。
- 我尝试使用Unison 文件系统,它可以短暂地同步文件,但后来始终显示连接错误。
- 我在 Jekyll 中启用了轮询,但这显著增加了从我的更改被捕获的延迟时间。
- 我尝试了Dinghy,一个“更快、更友好的 Docker”,并取得了一些进展。与 Jekyll 编译速度慢 10-15 倍相比,它现在只慢了 2-3 倍。这是更好的,但仍然不能满足使用需求。
是否有人找到了实际可行的解决方法,并允许您使用 Docker 和 OS X 生产性开发代码?
更新:终于找到了一种解决方法!
最终,我使用 Boot2Docker + rsync 找到了一种看起来很可行的解决方法。我已经记录了如何在我的答案以及一个名为docker-osx-dev的开源项目中设置此项的详细信息。