#ruby-on-rails #docker #rubygems
#ruby-on-rails #docker #rubygems
Вопрос:
Я использую Rails в контейнере Docker, и время от времени я сталкиваюсь с этой проблемой, которую я понятия не имею, как решить. При добавлении нового gem в Gemfile при перестроении Docker Image Container сборка завершится с ошибкой common bundler Could not find [GEM_NAME] in any of the sources; Run 'bundle install' to install missing gems
. Это происходит со мной только тогда, когда я пытаюсь создать образ в Docker, если я запускаю обычный bundle install
файл на своем локальном компьютере, Gemfile устанавливается правильно, и все работает, как ожидалось.
У меня довольно стандартный Dockerfile amp; docker-compose
file.
Dockerfile:
FROM ruby:2.6.3
ARG PG_MAJOR
ARG BUNDLER_VERSION
ARG UID
ARG MODE
# Add POSTGRESQL to the source list using the right version
RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
amp;amp; echo 'deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list
ENV RAILS_ENV $MODE
RUN apt-get update -qq amp;amp; apt-get install -y postgresql-client-$PG_MAJOR vim
RUN apt-get -y install sudo
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY Gemfile /usr/src/app/Gemfile
COPY Gemfile.lock /usr/src/app/Gemfile.lock
ENV BUNDLER_VERSION $BUNDLER_VERSION
RUN gem install bundler:$BUNDLER_VERSION
RUN bundle install
COPY . /usr/src/app
# 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 ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
:
version: '3'
services:
backend:
build:
dockerfile: Dockerfile
args:
UID: ${UID:-1001}
BUNDLER_VERSION: 2.0.2
PG_MAJOR: 10
mode: development
tty: true
stdin_open: true
volumes:
- ./[REDACTED]:/usr/src/app
- gem_data_api:/usr/local/bundle:cached
ports:
- "3000:3000"
user: root
Я пытался docker system prune -a
, docker builder prune -a
, переустановить Docker, несколько перестроек подряд, перезапустить мой компьютер и так далее, но безрезультатно. Странно то, что это происходит не с каждым новым драгоценным камнем, который я решаю добавить, а только для некоторых конкретных драгоценных камней. Например, я снова столкнулся с этой проблемой при попытке добавить gem 'sendgrid-ruby'
в свой Gemfile. Это репозиторий для gem для справки, и конкретная ошибка, с которой я sendgrid-ruby
сталкиваюсь, такова Could not find ruby_http_client-3.5.1 in any of the sources
. Я попытался указать ruby_http_client
в своем Gemfile, а также попытался ssh
войти в контейнер Docker и запустить gem install ruby_http_client
, но я получаю те же ошибки.
Что здесь может происходить?
Ответ №1:
Вы монтируете именованный том поверх /usr/local/bundle
каталога контейнера. Именованный том будет заполнен из изображения, но только при первом запуске контейнера. После этого старое содержимое именованного тома будет иметь приоритет над содержимым изображения: использование тома таким образом приведет к тому, что Docker полностью проигнорирует любые изменения, которые вы вносите в Gemfile
.
Вы должны иметь возможность удалить эту volumes:
строку из docker-compose.yml
файла. Я не понимаю, какую выгоду вы получите от хранения установленных драгоценных камней в именованном томе.