#ruby-on-rails #ruby #docker #docker-compose
#ruby-on-rails #ruby #docker #docker-compose
Вопрос:
Я новичок в docker и пытался интегрировать docker с моим приложением rails. Я следил за этим документом
Мне удалось настроить службы, но я столкнулся с проблемой.
Всякий раз, когда я добавляю драгоценный камень в свой Gemfile, я получаю docker-compose up
сообщение об ошибке
sidekiq_1 | bundler: failed to load command: sidekiq (/usr/local/bundle/bin/sidekiq)
sidekiq_1 | /usr/local/bundle/gems/bundler-2.2.3/lib/bundler/resolver.rb:309:in `block in verify_gemfile_dependencies_are_found!': Could not find gem 'awesome_print' in any of the gem sources listed in your Gemfile. (Bundler::GemNotFound)
Dockerfile
FROM ruby:3.0.0-alpine3.12
ENV BUNDLER_VERSION=2.2.3
RUN apk add --update --no-cache
binutils-gold
build-base
curl py-pip
curl
file
g
gcc
git
less
libstdc
libffi-dev
libc-dev
linux-headers
libxml2-dev
libxslt-dev
libgcrypt-dev
make
netcat-openbsd
nodejs
openssl
pkgconfig
python3
tzdata
yarn
RUN gem install bundler -v 2.2.3
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle config build.nokogiri --use-system-libraries
RUN bundle check || bundle install
COPY package.json yarn.lock ./
RUN yarn install --check-files
COPY . ./
ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]
docker-compose.yml
version: '3.6'
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: sna-main
depends_on:
- redis
ports:
- "3000:3000"
volumes:
- .:/app
- gem_cache:/usr/local/bundle/gems
- node_modules:/app/node_modules
environment:
RAILS_ENV: development
redis:
image: redis:5.0.7
sidekiq:
build:
context: .
dockerfile: Dockerfile
depends_on:
- app
- redis
volumes:
- .:/app
- gem_cache:/usr/local/bundle/gems
- node_modules:/app/node_modules
environment:
RAILS_ENV: development
entrypoint: ./entrypoints/sidekiq-entrypoint.sh
volumes:
gem_cache:
node_modules:
Было бы здорово, если бы кто-нибудь мог мне помочь понять, как запускать установку пакета каждый раз, когда происходит изменение в Gemfile.
Из документа я понял, что, поскольку мы кэшируем драгоценные камни, нам нужно явно удалить том, если мы добавим / удалим новый драгоценный камень.
Я действительно удалил тома, запустив docker-compose down -v
. Он удалил тома, но по-прежнему получал ту же ошибку.
Комментарии:
1. Вы должны удалить все
volumes:
, чтобы использовать код, встроенный в изображение. В частности, при монтировании тома/usr/local/bundle/gems
Docker будет использовать старую версию этого каталога и игнорировать любые изменения, которые вы вносите в свой сервисGemfile
.2. @DavidMaze — я использую
docker-compose down -v
для удаления всех томов, но все равно при запускеdocker-compose up
возникает та же проблема.
Ответ №1:
Есть вероятность, что это связано с тем, что docker-compose кэшировал ваши изображения; вам необходимо выполнить повторную сборку, docker-compose up --build
чтобы отразить изменения изображения в docker-compose.
Комментарии:
1. Спасибо за ответ, но, к сожалению, это не сработало. Я нашел способ, добавив
bundle install
в свой файл entrypoint
Ответ №2:
Я заставил его работать, добавив bundle install
в свой файл entrypoint
—————-./entrypoints/docker-entrypoint.sh——————
#!/bin/sh
set -e
if [ -f tmp/pids/server.pid ]; then
rm tmp/pids/server.pid
fi
bundle install
bundle exec rails s -b 0.0.0.0
—————-./entrypoints/sidekiq-entrypoint.sh——————
#!/bin/sh
set -e
if [ -f tmp/pids/server.pid ]; then
rm tmp/pids/server.pid
fi
bundle install amp;amp; bundle exec sidekiq -C config/sidekiq.yml