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

Yev*_*man 93 macos development-environment docker boot2docker

介绍

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

  1. 我可以使用我已安装的工具(文本编辑器,IDE,git等)修改OS X上的代码.
  2. 这些修改反映在Docker容器中,因此如果我重新运行测试或刷新网页,我可以立即看到我的更改.

理论上,通过将我的源代码作为卷安装,这应该很容易做到:

docker run -it -v /path/to/my/source/code:/src some-docker-image
Run Code Online (Sandbox Code Playgroud)

不幸的是,这有两个主要问题使它在OS X上完全无法使用:

问题#1:Virtual Box上安装的卷(使用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
Run Code Online (Sandbox Code Playgroud)

这是完全相同的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
Run Code Online (Sandbox Code Playgroud)

问题#2:文件观看被破坏了

SBT,Jekyll和grunt中的默认监视机制使用诸如inotify之类的技术,如果它们在Docker容器中运行并且在OS X中对安装的文件夹进行了更改,则它们不起作用.

我试过的解决方法

我搜索了解决方案(包括SO上的所有解决方案)并尝试了其中一些,但没有找到成功的解决方案:

  1. 将Boot2Docker切换为使用NFS,但速度一样慢.
  2. 我尝试过Vagrant + NFS,这也很慢.
  3. 我尝试了Samba安装,但该文件夹在Docker容器中始终显示为空.
  4. 我试图使用unison文件系统,它简单地用于同步文件,但后来一直显示连接错误.
  5. 在Jekyll中启用了轮询,但这显着增加了延迟,直到我的更改被拾取.
  6. 我尝试了小艇,一个"在OS X上使用Vagrant更快,更友好的Docker"并得到了一些改进.而不是jekyll编译慢10-15倍,它慢2-3倍.那更好,但仍然不太可用.

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

更新:终于解决了!

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

Yev*_*man 46

我决定用我迄今为止找到的最佳解决方案添加我自己的答案.如果我找到更好的选择,我会更新这个.

迄今为止最佳解决方案

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

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

自动安装

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

手动设置

  1. 安装Boot2Docker : brew 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. 使用文件观察器使文件保持同步.例如,您可以使用fswatch(brew install fswatch)管道进入rsync.
  8. 此时,您应该可以使用docker run启动Docker容器并使用该-v标志来挂载您正在同步的文件夹:docker run -v /foo/bar:/src some-docker-image.
  9. 像往常一样更新OS X上的代码.更改应使用rsync非常快速地传播,正常的文件观察程序代码应该像往常一样获取更改(即使用inotify),并且构建应该快速运行,因为所有文件都是容器的"本地".
  10. 如果您需要测试正在运行的网站,请运行该boot2docker ip命令以查找其所在的IP.


Pet*_*ons 18

更新:现在,对于mac的docker处于测试阶段且具有非黑客功能,对于本地开发来说,走这条路线可能更合理,没有文章的价值和解决方法.

不要.我知道这不是你可能希望得到的答案,而是对尝试获取本地源代码+ dockerized执行与仅在OSX上进行本地开发的成本/收益进行诚实的评估.

在某些时候,所有问题,设置工作和操作痛点都可以得到很好的解决,但是现在我对此的看法是净损失.

问题#1:Virtual Box上的挂载卷(使用vboxf)非常慢

等一会儿,这几乎肯定会有所改善.

问题#2:文件观看被破坏了

我不确定在不久的将来可以解决这个问题.如果这种类型的功能对您的开发工作流程至关重要,我会认为这是一个破解者.与仅仅使用rbenv/bundler管理你的jekyll/ruby​​安装并在OSX上本地运行它们相比,不值得进行大规模的研发工作,就像人们在过去十年里一直在成功做的那样.

就像"云"没有参与我的本地开发设置一样,目前,docker是测试/暂存/部署以及运行数据库和其他第三方组件的胜利,但我实际编码的应用程序直接运行在OSX上.

  • 嗯,这有点让人失望.在我的临时/制作环境中,我总是有平价.它是开发人员,因为我在OS X上编码,它总是异常值.Docker文档肯定让它听起来像是一个已解决的问题.我将再给它一天的努力,看看我是否可以得到一些工作. (4认同)

Qui*_*ant 12

适用于Mac和Windows的Docker将是在OS X(和Windows)上使用Docker进行开发的最终方式.作为Docker产品,该软件是一个"集成,易于部署的环境,用于从Mac或Windows构建,组装和运送应用程序."它旨在解决OP提出的问题.自 2016年3月24日公告:

  • 更快更可靠:不再需要VirtualBox!Docker引擎在Mac OS X上的xhyve虚拟机或Windows上的Hyper-V VM上运行在Alpine Linux发行版中,该VM由Docker应用程序管理.您不需要docker-machine来运行Docker for Mac和Windows.
  • 工具集成:Docker for Mac是Mac应用程序,Docker for Windows是Windows应用程序,包括本机用户界面和自动更新功能.Docker工具集与它捆绑在一起:Docker命令行,Docker Compose和Docker Notary命令行.
  • 代码和数据的卷安装:卷数据访问正常工作,包括文件更改通知(在Mac上,inotify现在可以无缝地在卷装入目录的容器内工作).这使得"容器"开发的编辑/测试周期成为可能.
  • 轻松访问本地主机网络上正在运行的容器:适用于Mac和Windows的Docker包括用于容器的DNS服务器,并与Mac OS X和Windows网络系统集成.在Mac上,即使连接到限制性很强的企业VPN,也可以使用Docker.
  • Docker for Mac从头开始构建,能够适应OS X沙箱安全模型,我们正在与Apple密切合作以实现这一目标.

  • 不幸的是,目前的Beta版本(1.11.0-beta7)似乎与其他方法一样慢,因此可能需要一段时间才能使用https://forums.docker.com/t/file-access-in -mounted体积,非常慢,CPU绑定/ 8076 (4认同)