Команда docker-compose run не может найти гем после запуска установки пакета - PullRequest
0 голосов
/ 23 апреля 2019

Я использую docker-compose для моего приложения rails.

Недавно я загрузил обновления в мою основную ветку, которая обновила версию 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!

Поэтому я пытаюсь установить гем вручную:

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 не отслеживает изменения в геме / компоновщике? Я что-то здесь упускаю?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Каждый docker-compose run запускает новый контейнер.Запустите его дважды, а затем запустите docker ps -a, и вы увидите два контейнера Exited.

Вам необходимо запустить bundle install как часть процесса построения образа внутри вашего Dockerfile.

Как подсказка, обычно сначала копируют только файлы Gemfile и Gemfile.lock, запускают bundle install и только затем копируют все приложение.Таким образом, вы создаете два отдельных слоя и избегаете переустановки всех драгоценных камней при изменении файлов приложения.

Вот 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 голос
/ 23 апреля 2019

docker-compose run создает новый контейнер каждый раз, когда он вызывается, ваши изменения не сохраняются.

Если вы хотите, чтобы ваши изменения сохранялись, используйте docker-compose exec, который запускает вашу команду в работающем контейнере.

...