Docker作为有效的Rails开发环境

[ 更新 ]

不幸的是,亲爱的同事,我现在放弃了docker工人。 主要因素:

  • 共享音量性能差(有一些解决方法使用额外的工具,但似乎更多的是黑客)。 不过对于那些使用Linux的好人来说这不是问题!
  • 我低估了一些前期工作,这是使远程运行时与编辑器/ IDE很好地配合所必需的。 像linting这样的东西假定一个本地的运行时框,似乎最广泛的解决scheme是无数的bash包装脚本委托执行到docker集装箱。

另外,我们聘请了两位DevOps开发人员,他们有相当多的Docker经验,如果他们能够提出,如何(无痛地)在我们公司中引入Docker来进行托pipe和开发,我很乐意修改这个主题。


[ 旧post ]

作为使用本机OSXpipe理程序的新版本,现在已经可以使用了,我决定尝试将所有的Ruby / Rails / JS开发推向Docker容器。 我在一个新鲜的El Capitan安装上玩了很多,试图将我们拥有的一些私有gem和我们的monolith Rails应用程序停泊在一起。

有几个问题,我希望我们的社区可以帮助解决。

目标一切正常 ,主机只安装了iTerm,git,Sublime,SourceTree和Docker(没有任何东西是刻着石头的,如果一些额外的依赖(-ies)可以改善/使工作stream程更容易,我将很乐意审查选项)

要求

  • 有相当多的服务(EngineYard,ElastiBeanstalk,Github等),需要我的密钥才能正常工作,我应该能够重用我的主机上的那些。
  • 在所有Ruby应用程序容器中重用已安装的RubyGems将会很不错。 基本上,docker container / docker-compose文件的安装方式与安装GEM_PATH的相同目录相同,每个容器中的bundler在其中安装gem。 应用程序bundler应该负责加载正确的版本。
  • 我应该能够轻松地debugging代码 – 将断点与debugging器交互,因为它将在本地运行
  • 它应该支持TDD循环 – 我改变文件,它被容器中的guard进程所捕获,并执行相关的testing
  • 当执行Cucumber / Seleniumtesting时,我应该能够看到浏览器中发生了什么。 (据我所知,选项是 – 通过VNC连接到虚拟帧缓冲区或本地运行X服务器,我更喜欢在主机端依赖较less的选项)。

问题

  • Docker化现有的应用程序是相对容易的,你怎么样,好人,处理创build/引导新项目? 常见的依赖关系的开发容器?
  • 是否可以像容器一样设置容器“保持运行”的方式呢? (这可能会解决我的许多需求 – 跑步guard ,更容易debugging,在同一运行中启动任意进程)
  • 我打算使用docker工具来打包我们的CI应用程序。 这意味着对于不同的环境,可能会有一些不同的依赖关系,挂载的卷也会有所不同(CI的容器可能不会有这些)。 是否应该作为docker-compose.yml (卷)中的不同configuration来解决,或者在不同docker-compose.yml文件中定义,这个docker-compose.yml文件是从docker-compose.ymlinheritance而来的?

其他想法

我也很好地尝试商业或非商业的工具,包装/捆绑描述的工具。 到目前为止,我已经find了一个名为http://wercker.com的东西),我不喜欢这个东西,似乎它需要你设置开发环境,这样做会消除整个努力的目的。

如果之前发布并明确回答,请随意投票。 另一方面,如果这个线程能够产生指导,链接和build议,以使它顺利完成,我会很高兴,我很确定这些日子里这个利益相当多的开发者。

考虑orats (自以为是的应用程序模板):

目标是为您提供一个优秀的基础应用程序,您可以使用您的下一个Rails项目。

和:

它也恰好使用Docker,以便您的应用程序可以在任何主要平台上运行 – 即使不需要安装Ruby。


对你的其他一些要求:

  • 我的钥匙…我应该能够重用我的主机上的那些

    docker-compose.yml指定键,但省略值 。

  • 把断点和debugging器交互

    在启动服务时,不要使用docker-compose run --service-ports docker-compose up ,而要使用docker-compose run --service-ports 。 这将允许例如binding.pry工作。

  • 当执行Cucumber / Seleniumtesting时,我应该能够看到浏览器中发生了什么。

    这是棘手的。 有关解决方法,请考虑使用save_screenshot ,(重要部分)将其保存到挂载到Docker主机上的卷的目录中。 在主机上打开该目录,您将能够看到更新的屏幕截图。

有关使用docker进行开发的一些注意事项:

  • 在Docker中运行bash命令,并像VM, 链接一样工作
  • 与主机映射容器的端口并使用浏览器链接
  • 地图文件链接
  • .env设置variables的技术允许在包括CI 链接的任何环境中使用docker
  • bash脚本和容器命名可以帮助自动化任务链接