一尘不染

用Docker在OS X上设置开发环境的正确方法是什么?

docker

介绍

我想不出一种使用Docker和Boot2Docker在OS X上设置开发环境的好方法。我遇到的问题是如何管理源代码,以便:

  1. 我可以使用已经安装的工具(文本编辑器,IDE,git等)在OS X上修改代码。
  2. 这些修改反映在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上的所有解决方案),并尝试了其中的一些解决方案,但没有找到成功的解决方案:

  1. 将Boot2Docker切换为使用NFS,但速度同样慢。
  2. 我尝试了Vagrant + NFS,而且速度也一样慢。
  3. 我尝试了Samba挂载,但是该文件夹在Docker容器中始终显示为空。
  4. 我尝试使用Unison文件系统,该系统可以短暂地同步文件,但随后一直显示连接错误
  5. 在Jekyll中启用了轮询功能,但这大大增加了延迟,直到我的更改被提取为止。
  6. 我尝试了Dinghy,它是“带有Vagrant的OS X上更快,更友好的Docker”,并得到了 一些 改进。Jekyll编译的速度要慢2-3倍,而不是Jekyll的慢10-15倍。更好,但仍然不太实用。

有没有人找到一个切实可行的解决方案,并允许您使用Docker和OS X高效地开发代码?

更新:终于解决了!

我终于找到了一个使用Boot2Docker +
rsync似乎很有成效的解决方案。我已经在我自己的答案以及一个名为docker-osx-dev的开源项目中捕获了有关如何进行设置的详细信息。


阅读 320

收藏
2020-06-17

共1个答案

一尘不染

我决定添加自己的答案以及到目前为止找到的最佳解决方案。 如果找到更好的选择,我将进行更新。

迄今为止最好的解决方案

我发现在OS X上使用Docker设置生产性开发环境的最佳解决方案是: Boot2Docker + Rsync
。使用rsync,可直接在OSX上运行Docker容器中的构建时间!此外,该文件观察家代码并 没有
需要轮询(inotify因为rsync使用普通文件夹的作品),所以热重装是 几乎 一样快。

有两种设置方法:自动安装和手动安装。

自动安装

我已将使用Rsync设置Boot2Docker的所有步骤打包到一个名为docker -osx-
dev的
开源项目中。代码有点粗糙,但是我已经成功使用了几周,可以轻松地在具有3种不同技术堆栈的3个项目之间切换。试试看,报告错误,并提交一些PR!另外,有关更多信息,请参阅我的博客文章“
在OS X上使用Docker进行高效的开发环境”

手动设定

  1. 安装Boot2Dockerbrew install boot2docker
  2. 运行Boot2Docker,但禁用VirtualBox共享文件夹:boot2docker init && boot2docker start --vbox-share=disable
  3. 运行boot2docker shellinit并将其打印出的环境变量复制到您的~/.bash_profile文件中。
  4. 在Boot2Docker VM上安装rsync :boot2docker ssh "tce-load -wi rsync"
  5. 在Boot2Docker VM上创建所需的基本文件夹,并为其正确设置权限。例如,如果/foo/bar要从OS X 同步文件夹,则需要/foo/bar在Boot2Docker VM上创建:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
  6. 运行的rsync同步文件到Boot2Docker VM: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo。在rsync文档中检查您可能要启用的各种设置,例如在同步时--exclude .git用于排除.git文件夹。
  7. 使用文件观察器使文件保持同步。例如,您可以使用通过brew install fswatch管道传递到rsync的fswatch()。
  8. 在这一点上,您应该能够docker run启动Docker容器并使用该-v标志挂载您要同步的文件夹:docker run -v /foo/bar:/src some-docker-image
  9. 照常更新OS X上的代码。更改应使用rsync迅速传播,常规文件监视程序代码应照常进行更改(即,使用inotify),并且构建应快速运行,因为所有文件都是“本地”到容器的。
  10. 如果需要测试正在运行的网站,请运行boot2docker ip命令以查找其所使用的IP。
2020-06-17