运行bundle install后docker-compose run命令无法找到gem

时间:2019-04-23 17:29:32

标签: ruby-on-rails docker rspec docker-compose bundler

我正在为我的Rails应用程序使用docker-compose。

我最近提取了对我的master分支的更新,该更新将rails版本更新为5.2.3-我通过docker-compose进行了捆绑安装:

docker-compose run web bundle install

似乎运行良好,但是随后当我尝试运行rspec时,出现此错误:

Could not find activesupport-5.2.3 in any of the sources
Run `bundle install` to install missing gems.

我尝试运行bundle update activesupport-并获得:

Bundler attempted to update activesupport but its version stayed the same
Bundle updated!

所以我尝试手动安装gem:

docker-compose run web gem install activesupport
Fetching activesupport-5.2.3.gem
Successfully installed activesupport-5.2.3
1 gem installed

然后我尝试再次运行rspec,同样的事情:

$ docker-compose run web bin/rspec ./spec/some_spec.rb 
Could not find activesupport-5.2.3 in any of the sources
Run `bundle install` to install missing gems.

docker-compose是否没有掌握gem / bundler的变化?我在这里想念东西吗?

2 个答案:

答案 0 :(得分:3)

每个docker-compose run正在启动一个新容器。 运行两次,然后运行docker ps -a,您将看到两个Exited容器。

作为图像构建过程的一部分,您需要在bundle install内部运行Dockerfile

作为旁注,通常的做法是先仅复制GemfileGemfile.lock文件,运行bundle install,然后再复制整个应用程序。这样,您可以创建两个单独的层,并避免在应用程序文件更改时重新安装所有gem。

这里是Dockerfile供参考。

FROM ruby:2.5.3

WORKDIR $RAILS_ROOT

# ... more custom stuff here ...

# Pre-install gems
COPY Gemfile* ./
RUN gem install bundler && bundle install --jobs=3 --retry=3 

# Copy app files
COPY . .
RUN chmod -R 755 $RAILS_ROOT/bin

# Run server
EXPOSE 3000
CMD bundle exec rails s -b 0.0.0.0 -p 3000

答案 1 :(得分:1)

docker-compose run每次创建一个新容器时,您的更改都不会持久。

如果您希望更改保留下来,请使用docker-compose exec,它会在正在运行的容器中运行命令。