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

Macos 什么';使用Docker在OS X上设置开发环境的正确方法是什么? 简介,macos,docker,development-environment,boot2docker,Macos,Docker,Development Environment,Boot2docker,我想不出一个使用Docker和Boot2Docker在OSX上建立开发环境的好方法。我遇到的问题是如何管理源代码,以便: 我可以使用已经安装的工具(文本编辑器、IDE、git等)修改OSX上的代码 这些修改反映在Docker容器中,因此如果我重新运行测试或刷新网页,我可以立即看到我的更改 理论上,通过将我的源代码装入一个卷,这应该很容易做到: docker run -it -v /path/to/my/source/code:/src some-docker-image 不幸的是,这有两个主要

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

  • 我可以使用已经安装的工具(文本编辑器、IDE、git等)修改OSX上的代码
  • 这些修改反映在Docker容器中,因此如果我重新运行测试或刷新网页,我可以立即看到我的更改
  • 理论上,通过将我的源代码装入一个卷,这应该很容易做到:

    docker run -it -v /path/to/my/source/code:/src some-docker-image
    
    不幸的是,这有两个主要问题使得它在OS X上完全不可用:

    问题1:VirtualBox(使用vboxsf)上装载的卷速度非常慢 例如,如果源代码是Docker映像的一部分,那么Jekyll编译my需要多长时间:

    > 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中对装载的文件夹进行更改,则这些技术不起作用

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

  • 我知道,但也一样慢
  • 我试过了,但也同样慢
  • 我尝试了一个文件夹,但Docker容器中的文件夹总是显示为空的
  • 我尝试使用,它可以短暂地同步文件,但随后保持同步
  • 我启用了,但这大大增加了延迟,直到我的更改被提取
  • 我尝试了“在OSX上用流浪汉做一个更快、更友好的码头工人”,并得到了一些改进。与Jekyll编译慢10-15倍不同,它慢了2-3倍。这样更好,但仍然不太实用
  • 有没有人找到了一个实际可行的解决方案,让您能够使用Docker和OS X高效地开发代码

    更新:终于有解决方案了!
    我终于找到了一个使用Boot2Docker+rsync似乎很有效的解决方案。我已经捕捉到了如何在中设置此功能的详细信息,以及一个名为的开源项目。

    更新:现在它已处于测试阶段,具有非黑客功能,如果没有文章价值的黑客和变通方法,走这条路对本地开发可能更为合理

    不要。我知道这不是您可能希望得到的答案,但请诚实地评估一下,与仅在OSX上进行本地开发相比,尝试获取本地源代码+停靠执行的成本/收益

    在某个时候,所有的问题、安装工作和操作难点都可能得到很好的解决,但就目前而言,我认为这是一个净损失

    问题#1:虚拟盒(使用vboxfs)上装载的卷速度非常慢

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

    问题2:文件监视被破坏

    我不确定在不久的将来是否能解决这个问题。如果这种类型的功能是开发工作流的关键,我会认为这是一个经销商。与仅仅使用rbenv/bundler来管理您的jekyll/ruby安装并在OSX上本地运行它们相比,这不值得进行大量的研发工作,就像过去十年来人们所做的那样


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

    我一直在OSX上开发(2011年年中Macbook Air)+Boot2Docker+Docker组合环境几周。没有遇到过主要的性能问题,但我在开发时避免运行任何类型的构建(为什么不使用类似于
    jekyllservice的东西——跳过初始构建?
    )。下面是我使用的一个示例
    docker compose.yml
    文件:

    docker-compose.yml:

    test:
      build: .
      volumes:
        - ./client:/src/client
        - ./server:/src/server
        - ./test:/src/test
      command: nodemon --exec jasmine-node -- test/ --verbose --autotest --captureExceptions --color
      environment:
        - DEBUG=*
    
    Dockerfile:

    FROM node:0.12
    
    RUN mkdir -p /src
    WORKDIR /src
    
    ENV PATH=/src/node_modules/.bin:$PATH
    
    # We add package.json first so that we the
    # image build can use the cache as long as the
    # contents of package.json hasn't changed.
    
    COPY package.json /src/
    RUN npm install --unsafe-perm
    
    COPY . /src
    
    CMD [ "npm", "start" ]
    EXPOSE 3000
    
    我有时使用NFS(),但在这样做时并没有注意到有很大的性能差异

    对我来说,一个简单的
    docker compose up测试
    让我的环境运行起来的便利性,在性能上是值得的(我经常使用不同的堆栈处理多个项目)


    PS:
    nodemon
    是为数不多的使用vboxsf的文件监视程序之一(请参阅)

    我感觉到你了!我想我已经尝试了几乎所有你尝试过的东西,不幸的是它仍然很慢。然后我看到了这条评论,建议使用Vagrant和Parallels,而不是Virtualbox。这使我能够使用nfs,我确实看到我的项目(Drupal)的性能有了很大提高

    这是流浪汉档案。您只需安装vagrant,将其复制到名为Vagrantfile的文件中,并将其放入某个文件夹中。转到该文件夹,只需执行
    vagrant up
    ,而不是正常的boot2docker up

    Vagrant.configure(2) do |config|
      config.vm.box = "parallels/boot2docker"
    
      config.vm.network "forwarded_port", guest: 80, host: 80
    
      config.vm.synced_folder(
        "/Users/dicix/work/www", "/vagrant",
        type: 'nfs',
        nfs_udp: true,
        mount_options: %w[actimeo=2],
        bsd__nfs_options: %w[alldirs maproot=root:wheel]
      )
    end
    

    让docker作为开发工具工作是可能的。但这会很痛。我在这里记录了这个过程:

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

    迄今为止最好的解决方案 我找到的在OS X上使用Docker建立高效开发环境的最佳解决方案是:Boot2Docker+Rsync。使用RSyc,在DOCKER容器中构建时间与直接在OSX上运行构建很相称!此外,文件监视程序代码不需要轮询(
    inotify
    可以工作,因为rsync使用普通文件夹),因此热重新加载几乎同样快

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

    自动安装 我已经将使用Rsync设置Boot2Docker的所有步骤打包到一个名为。代码有点粗糙,但我已经成功地将其用于服务器
    Vagrant.configure(2) do |config|
    
      config.vm.network "private_network", ip: "192.168.33.10"
      config.vm.box = "parallels/boot2docker"
    
      config.vm.synced_folder "/Users", "/Users", type: "nfs", mount_options: ["nolock", "vers=3", "udp"], id: "nfs-sync"
    
    end