【发布时间】:2015-05-07 00:39:39
【问题描述】:
简介
我想不出使用 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 编译我的homepage 需要多长时间:
> 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上的所有解决方案)并尝试了其中的一些,但没有找到成功的解决方案:
- 我switched Boot2Docker to use NFS,但速度一样慢。
- 我试过Vagrant + NFS,也一样慢。
- 我尝试了Samba mount,但该文件夹在 Docker 容器中总是显示为空。
- 我尝试使用Unison file system,它可以短暂地同步文件,但随后保留了showing connection errors。
- 我启用了polling in Jekyll,但这显着增加了我的更改被接受之前的延迟。
- 我尝试了Dinghy,这是一个“在 OS X 上使用 Vagrant 更快、更友好的 Docker”,并得到了一些的改进。 Jekyll 编译不是慢了 10-15 倍,而是慢了 2-3 倍。这更好,但仍然不太好用。
有没有人找到真正有效的解决方案,让您可以使用 Docker 和 OS X 高效地开发代码?
更新:终于找到解决方案了!
我终于找到了一个使用 Boot2Docker + rsync 似乎很有成效的解决方案。我已经在my own answer 以及一个名为docker-osx-dev 的开源项目中捕获了有关如何设置它的详细信息。
【问题讨论】:
-
您已经尝试过用于 OS X 的官方 Docker 安装程序以及 NFS? AFAIK 这不仅是 OS X 上的 Docker 问题,还包括基于 Vagrant 在 OS X 上进行更大代码库的开发(我们也有类似的问题,但 Vagrant )。我发现 NFS 是唯一可行且可接受的解决方案。
-
@JamesMills:我按照官方说明安装了 Docker 和 Boot2Docker。有设置 NFS 的官方说明吗?我只在 GitHub gist 中找到了它们,并且在使用它们之后,它似乎并没有更快。你是如何设置 NFS 的?
-
使用 Docker 的正确方法是在本地运行 Linux 而不是 OS X,或者在 Linux VM 中完成所有开发工作。 “boot2docker”集成是一个丑陋的大黑客,除了播下混乱和失望之外什么也没做。
-
@larsks:这没有帮助。
标签: macos docker development-environment boot2docker