构建Ruby on Rails应用Docker镜像时bundle install失败如何解决
问题根源
报错是因为你本地生成的Gemfile.lock已经绑定了旧环境的Ruby 2.5.9和Bundler 1.17.3版本,和Docker镜像中的新版Ruby环境不兼容。你之前添加的RUN gem bundle install是无效命令,正确的Bundler安装命令为gem install bundler。
修复步骤
- 首先删除本地旧的
Gemfile.lock文件,避免旧版本绑定信息带入镜像构建流程 - 调整Dockerfile配置:
- 基础镜像使用官方稳定版Ruby镜像,示例:
FROM ruby:3.2.2-alpine,可根据需要选择slim或者完整版镜像 - 提前安装指定的高版本Bundler,添加命令:
RUN gem install bundler:2.4.13(可替换为当前最新的稳定版Bundler版本号) - 安装Rails 6、MySQL所需的系统依赖,比如alpine镜像需要添加
build-base mysql-dev tzdata nodejs yarn等依赖包 - 复制
Gemfile到容器工作目录后,执行bundle install安装依赖
- 基础镜像使用官方稳定版Ruby镜像,示例:
- 调整Gemfile配置:明确指定Rails 6稳定版,示例:
gem 'rails', '~> 6.1.7',数据库适配器使用gem 'mysql2', '~> 0.5.5',不要添加强制锁定旧Ruby、旧Bundler版本的配置 - 调整docker-compose.yml配置:数据库服务使用
mysql:8.0镜像,配置正确的MYSQL_ROOT_PASSWORD、MYSQL_DATABASE等环境变量;web服务启动命令建议设置为bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'",避免pid文件残留导致启动失败 - 首次构建前先执行
docker-compose run --rm web bundle install,在容器环境中生成全新的Gemfile.lock,该文件会自动绑定容器内的新版Ruby和Bundler版本,之后再执行docker-compose build即可正常完成构建
版本兼容说明
- Ruby 3.0+ 版本天然兼容 Bundler 2.2+ 以及 Rails 6.1.x 全系列稳定版本
- 不要直接将本地开发环境生成的
Gemfile.lock带入容器构建流程,除非你本地的Ruby、Bundler版本和容器内的版本完全一致 - 每次升级Ruby或者Bundler版本后,都需要重新在容器内执行
bundle install生成新的锁定文件
内容的提问来源于stack exchange,提问作者Peck3277
相关产品推荐
相关产品推荐

