You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Rails应用报错:无法找到rake-12.3.1 gem

解决Docker中Rails镜像无法启动、找不到rake的问题

我之前碰到过类似的Docker + Rails依赖缺失的坑,结合你描述的报错(Bundler::GemNotFound: Could not find rake-12.3.1),给你几个针对性的排查和修复步骤:

1. 确认Gemfile与Gemfile.lock的一致性

首先排查镜像构建时的依赖配置:

  • 检查有问题的镜像对应的代码仓库中,Gemfile.lock是否明确包含rake (12.3.1)?如果本地lock文件里有这个版本,但镜像里没装,大概率是构建时没正确同步lock文件。
  • 查看你的Dockerfile,是否在bundle install前同时COPY了Gemfile和Gemfile.lock?正确的写法应该是:
    COPY Gemfile Gemfile.lock ./
    RUN bundle install
    
    如果只COPY了Gemfile,bundler会忽略lock文件拉取最新版本的gem,就会出现版本不匹配的问题。

2. 进入镜像手动排查依赖状态

直接进入有问题的镜像,查看gem安装情况:

  • 执行命令进入镜像shell:
    docker run -it --entrypoint sh <你的镜像名称/ID>
    
  • 查看已安装的rake版本:
    bundle list rake
    
    如果返回找不到,手动执行bundle install,观察是否有网络或源的报错。如果是网络问题,可以在Dockerfile中替换国内gem源:
    RUN bundle config mirror.https://rubygems.org https://gems.ruby-china.com
    RUN bundle install
    

3. 检查工作目录与bundle路径配置

有时候工作目录或bundle安装路径不对,导致bundler找不到gem:

  • 确认Dockerfile中设置了正确的工作目录,比如:
    WORKDIR /app
    
  • 查看镜像中的bundle路径环境变量:
    echo $BUNDLE_PATH
    
    报错里提到的路径是/usr/local/bundle,如果输出不一致,需要在Dockerfile中添加环境变量配置:
    ENV BUNDLE_PATH=/usr/local/bundle
    

4. 对比两个镜像的构建差异

既然另一个镜像能正常启动,对比两者的构建细节:

  • 检查两个镜像的Dockerfile是否有差异,比如一个用了bundle install --no-deployment,另一个没加?
  • 确认构建时的环境变量是否一致,比如是否设置了RAILS_ENV=production,导致只安装了production组的gem,而rake属于development/test组?如果是这种情况,需要调整bundle install命令:
    RUN bundle install --with development test
    

如果以上步骤都试过还是不行,可以尝试重新构建镜像,确保构建上下文没有缓存问题:

docker build --no-cache -t <镜像名> .

内容的提问来源于stack exchange,提问作者Gulnaz Kassymova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:59:52