我遇到了一个奇怪的问题,试图将一个(相当大的)rails应用程序停靠。我现在正在使用官方的ruby docker镜像,并将我的代码安装到应用程序中。使用:
cd /code
bundle install
rails c
然后在我运行的容器中:
bundle install --deployment
这很好用(我无法连接到数据库,因为我没有链接它,但rails控制台运行正常并加载我的应用程序。)
但是,当我改为运行rails c
时,运行{{1}}只会永远挂起。
知道可能导致这种情况的原因吗?
我希望使用gems的本地副本,因为我们还使用了一堆npm模块(在本地安装到node_modules中)所以我认为将gems保存在本地目录中也是最直接的在开发环境中的docker run之间具有相同的持久性。
答案 0 :(得分:0)
没关系我弄清楚了 - 由于Virtualbox的默认类型的共享驱动器,它并没有完全悬空。代码在我的OSX文件系统上,作为共享驱动器安装到Virtualbox(使用vagrant),然后作为卷安装到docker中。当宝石安装到供应商/捆绑包中时,它们都必须从这个缓慢的卷中加载,并且总共有大约150个宝石具有所有依赖项。
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
因此启动rails需要2分钟。我改变了流浪汉使用NFS共享卷,这使得启动时间减少到大约12秒(实际上快了10倍,我听说NFS快了2倍,但这非常疯狂)。仅使用bundle install
全局安装gems就没有任何损失,它通常是3-4秒的rails加载时间,这与我在OSX中运行的内容相同。