`rails控制台`在使用vendoredgems时挂起(在docker中运行)



我在尝试停靠一个(相当大的)rails应用程序时遇到了一个奇怪的问题。我现在正在使用官方的ruby docker镜像,并将我的代码安装到应用程序中。使用:

docker pull ruby:2.2.4
docker run -it -v $PWD:/code ruby:2.2.4 bash

然后在容器中我运行:

cd /code
bundle install
rails c

这很好(我显然无法连接到数据库,因为我没有链接它,但rails控制台正常运行并加载我的应用程序)。

然而,当我改为运行bundle install --deployment时,运行rails c将永远挂起。

知道是什么原因造成的吗?

我希望使用gem的本地副本,因为我们还使用了一堆npm模块(它们在本地安装到node_modules中),所以我认为将gem也保存在本地目录中是最简单的,并且在开发环境中的docker运行之间具有相同的持久性。

尽管我已经弄清楚了——由于Virtualbox的默认共享驱动器类型,它并没有完全挂起,只是速度非常慢。代码在我的OSX文件系统上,作为共享驱动器安装到Virtualbox中(使用流浪),然后作为卷安装到docker中。当gem被安装到供应商/捆绑包中时,它们都必须从这个缓慢的卷中加载,并且总共有大约150个gem和所有的依赖项。

root@fa575694f86a:/code# time echo puts :ok | rails c
Loading development environment (Rails 4.2.1)
Switch to inspect mode.
irb: warn: can't alias context from irb_context.
puts :ok
ok
nil

real    2m0.937s
user    0m2.574s
sys     0m59.985s

因此,仅仅发射轨道就需要整整2分钟。我将流浪者改为使用NFS共享卷,这将启动时间缩短到了约12秒(实际上快了10倍,我听说NFS快了2倍,但这太疯狂了)。只使用bundle install全局安装gems没有任何惩罚,这是通常3-4秒的rails加载时间,这与我在OSX中运行的时间相同。

最新更新