Запуск установки пакета после добавления / удаления нового драгоценного камня при использовании docker-compose

#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