构建Docker镜像时bundle install报错:需用Bundler 2及以上版本
解决Docker构建Rails应用时的Bundler版本不匹配问题
嘿,作为Docker新手碰到这个问题真的很头疼对吧?我之前踩过完全一样的坑,问题出在Dockerfile里的命令顺序上——你先把整个项目(包括Gemfile.lock)复制到容器里了,之后才安装Bundler 2.0.2,这时候执行bundle install用的还是Ruby镜像自带的旧版Bundler,自然就会报错。
修正后的Dockerfile
FROM ruby:2.5.1 ENV APP_HOME /usr/src/app RUN apt-get update -qq && apt-get install -y build-essential libpq-dev # Node.js RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - \ && apt-get install -y nodejs RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && apt-get install -y yarn # 先安装指定版本的Bundler,再处理Gemfile相关文件 RUN gem install bundler --version 2.0.2 --no-rdoc --no-ri # SOURCE CODE WORKDIR $APP_HOME # 先复制Gemfile和Gemfile.lock,利用Docker缓存,只有依赖变化时才重新安装 ADD Gemfile $APP_HOME/ ADD Gemfile.lock $APP_HOME/ RUN bundle install # 最后复制整个项目代码 COPY . $APP_HOME/ RUN echo '--color' >> ~/.rspec
为什么这样改就没问题了?
- 顺序调整:先安装Bundler 2.0.2,确保后续执行
bundle install时用的是你指定的新版本,而不是系统默认的旧版本。 - 缓存优化:把
Gemfile和Gemfile.lock的复制放在bundle install之前,只有当这两个文件变化时,Docker才会重新执行bundle install,否则会直接用缓存的镜像层,加快构建速度。
另外,你可以先在本地执行bundle update --bundler确保你的Gemfile.lock确实是用Bundler 2.x生成的,不过按照上面的Dockerfile调整后,这个报错应该就能解决了。
内容的提问来源于stack exchange,提问作者Alvaro Alday
相关产品推荐
相关产品推荐

