Docker Compose и Rails: Bundler :: GemNotFound после запуска. Бандлер не смотрит на правильный гемсет? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь следовать инструкциям по настройке приложения Rails и Postgres с помощью Docker Compose, как указано в документации здесь -> https://docs.docker.com/compose/rails/.

Однако , когда я пытаюсь запустить приложение, после успешной настройки базы данных, при запуске docker-compose up я застреваю со следующей ошибкой:

docker-compose up
Creating docker-and-cms_db_1 ... done
Creating docker-and-cms_web_1 ... done
Attaching to docker-and-cms_db_1, docker-and-cms_web_1
web_1  | bundler: failed to load command: rails (/usr/local/bundle/bin/rails)
web_1  | Bundler::GemNotFound: Could not find bindex-0.8.1 in any of the sources
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/spec_set.rb:91:in `block in materialize'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/spec_set.rb:85:in `map!'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/spec_set.rb:85:in `materialize'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/definition.rb:170:in `specs'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/definition.rb:237:in `specs_for'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/definition.rb:226:in `requested_specs'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/runtime.rb:108:in `block in definition_method'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/runtime.rb:20:in `setup'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler.rb:107:in `setup'
web_1  |   /usr/local/lib/ruby/2.6.0/bundler/setup.rb:20:in `<top (required)>'
web_1  |   /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
web_1  |   /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
docker-and-cms_web_1 exited with code 1

Некоторые ранние исследования с моей стороны:

  • Я использую образ ruby: 2.6.5, и кажется, что сообщение об ошибке указывает на то, что упаковщик пытается найти драгоценные камни в папке /usr/local/lib/ruby/2.6.0, и это выглядит подозрительно. Я подозреваю, что проблема с версией, возможно, среда не установлена ​​должным образом.

Вот мой Dockerfile

# From https://docs.docker.com/compose/rails/
FROM ruby:2.6.5

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install --path vendor/cache

COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

Вот мой entrypoind.sh

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

И наконец вот мой docker-compose.yml файл

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

А вот и начало моего Gemfile (отредактировано, потому что релевантны только первые строки, я думаю):

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.5'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.4', '>= 5.2.4.1'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# (...)

Отладочная информация: - Это то, что работает bundle env в контейнере docker и возвращает:

root@588227887e16:/myapp# bundle env
## Environment


Bundler       1.17.2
  Platforms   ruby, x86_64-linux
Ruby          2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
  Full Path   /usr/local/bin/ruby
  Config Dir  /usr/local/etc
RubyGems      3.0.3
  Gem Home    /usr/local/bundle
  Gem Path    /root/.gem/ruby/2.6.0:/usr/local/lib/ruby/gems/2.6.0:/usr/local/bundle
  User Path   /root/.gem/ruby/2.6.0
  Bin Dir     /usr/local/bundle/bin
Tools
  Git         2.20.1
  RVM         not installed
  rbenv       not installed
  chruby      not installed


## Bundler Build Metadata


Built At          2018-12-19
Git SHA           3fc4de72b
Released Version  false


## Bundler settings


path
  Set for your local app (/usr/local/bundle/config): "vendor/cache"
app_config
  Set via BUNDLE_APP_CONFIG: "/usr/local/bundle"
silence_root_warning
  Set via BUNDLE_SILENCE_ROOT_WARNING: true

Спасибо за помощь!

1 Ответ

0 голосов
/ 17 февраля 2020

В контейнере Docker, как вы говорите, Bundler ищет драгоценные камни в неправильном каталоге. Либо Ruby 2.6.0 установлен и найден Bundler при запуске контейнера, либо что-то скопировано в контейнер, чтобы Bundler поверил, что Ruby 2.6.0 установлен.

Когда вы используете Docker image ruby: 2.5.6, второй вариант выше более вероятен

Если вы посмотрите на строки 8-9 вашего Dockerfile, вы увидите, что Gemfile и Gemfile.lock скопированы с вашего локального компьютера в контейнер, при создании образа Docker.

Я думаю, что здесь может произойти то, что Gemfile.lock, сгенерированный на вашем локальном компьютере, был выполнен с использованием Ruby 2.6.0.

Какая у вас локальная машина (не в контейнере) Ruby версия? Запустите ruby -v, чтобы увидеть.

Попробуйте установить Ruby 2.6.5 на локальном компьютере и запустить bundle install, чтобы обновить Gemfile.lock.

Я на своем мобильном Я не могу проверить это сам в настоящее время. Но это где-то начать!

...