Docker CLI中无法执行rails g命令 提示找不到rake-12.3.2错误
问题根因
- 挂载卷覆盖了依赖执行上下文:你的docker-compose配置中将本地项目目录挂载到了容器的
/app路径,Dockerfile构建阶段执行的bundle install是将项目依赖安装到容器内/usr/local/bundle路径下。容器启动后挂载本地目录,直接执行rails g命令时,会优先读取本地挂载目录下的Gemfile依赖上下文,同时你的启动命令加了bundle exec前缀所以服务能正常运行,直接执行rails命令时没有该前缀,就会出现依赖匹配失败的问题。你之前正常运行的rails db:create、rails db:migrate是Dockerfile构建阶段执行的,此时还没有挂载本地卷,使用的是纯容器内的依赖环境,因此没有报错。 - 多版本rake冲突:你排查到两个rake可执行文件,
/usr/local/bin/rake是系统全局安装的版本,/usr/local/bundle/bin/rake是bundle安装的匹配你项目Gemfile的12.3.2版本,直接执行rails命令时会优先调用全局rake,和项目要求的版本不匹配,因此抛出找不到对应版本的错误。
解决方法
- 执行rails相关命令时统一添加
bundle exec前缀,强制使用项目Gemfile对应的依赖版本执行,示例命令如下:docker-compose run web bundle exec rails g 你的生成器名称 - 调整docker-compose挂载规则,避免本地卷覆盖容器内的依赖路径,修改web服务的volumes配置,添加路径排除即可:
volumes: - .:/app - /usr/local/bundle # 排除容器内的全局依赖路径,不被本地挂载覆盖 - 若希望依赖和项目目录绑定,可修改Dockerfile中的bundle install命令,将依赖安装到项目目录下:
RUN gem install bundler && bundle install --path vendor/bundle - 若不需要全局rake版本,可进入容器执行
gem uninstall rake -a,只保留bundle路径下的对应版本,从根源消除版本冲突。
内容的提问来源于stack exchange,提问作者kaizenx
相关产品推荐
相关产品推荐

