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

docker-compose启动找不到Gemfile但docker run运行正常是什么原因?

问题根因
  • 核心问题是docker-compose.yml中的卷挂载配置错误,导致镜像内的Gemfile被本地无对应文件的目录覆盖
  • 构建阶段指定的context为./api/,说明Rails项目代码(包含Gemfile)全部存放在项目根目录下的./api/子目录中,构建时这些文件会被正常打包到镜像的/app目录内。docker run默认没有挂载本地卷,会直接读取镜像内/app下的Gemfile,因此运行正常
  • docker-compose.yml中配置的卷规则为.:/app,会将docker-compose.yml所在的父级目录直接覆盖到容器的/app路径,父级目录下不存在Gemfile(Gemfile在子目录./api/中),因此启动时找不到对应文件抛出错误,退出码为10
解决方案

你可以根据自己的使用需求选择以下任意一种修复方案:

  • 修改挂载卷路径,将正确的项目目录挂载到容器内:将volumes配置改为./api:/app,这样会把存放Gemfile的./api子目录挂载到容器的/app路径,不会覆盖项目文件
  • 如果不需要本地开发热重载能力,可以直接删除volumes配置,直接使用镜像内打包好的项目文件运行
  • 如果你确实需要挂载父级目录,可以调整容器的工作目录配置为/app/api,或者修改bundle的Gemfile查找路径适配目录结构
快速验证方法

你可以临时注释掉docker-compose.yml中web服务的volumes配置项,再执行docker-compose up,如果服务能正常启动,即可确认是卷挂载覆盖导致的问题。

内容的提问来源于stack exchange,提问作者Michael Choi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:15:00