Problem z instalacją gemów w dockerze

Cześć!

Ostatnio zacząłem moją przygodę z dockerem i mam kłopot z poprawnym użyciem bundlera w moich “zdokeryzowanych” aplikacjach. Problem polega na tym, że ilekroć dodaję nowy gem do mojego Gemfile, to nie wystarcza jedynie odpalenie docker-compose run app bundle install (próba uruchomienia aplikacji wywala Bundler::GemNotFound: Could not find [gem którego dodałem do gemfile] in any of the sources. Jedyna opcja to przebudowanie obrazu (docker-compose build) i dopiero po tym - uruchomienie bundle install.

Jak możęcie się domyślić jest to mocno uciążliwe bo sprowadza się do uruchamiania bundle install dwa razy (z czego pierwszy instaluje WSZYSTKIE gemy od zera) - czyli zajmuje to kupę czasu. Poniżej moje pliki:

Dockerfile

FROM ruby:2.3.3-slim

RUN apt-get update && apt-get install -y \
  build-essential \
  cmake \
  git \
  libpq-dev \
  curl \
  python \
  pkg-config \
  imagemagick

ENV APP_HOME=/app

RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

COPY Gemfile* ./
COPY modules ./modules

RUN gem install bundler
RUN echo '{ "allow_root": true }' > /root/.bowerrc
RUN bundle install --jobs 20 --retry 5

COPY . ./

EXPOSE 3000

CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

HEALTHCHECK CMD curl --fail http://0.0.0.0:3000/healthcheck || exit 1

docker-compose.yml

version: '3'

services:
  app: &app_base
    build:
      context: .
      dockerfile: Dockerfile.dev
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - 3001:3000
    links:
      - database
      - redis
    volumes:
      - .:/app
    environment: &app_environment
      DATABASE_URL: postgres://postgres@database:5432/nemu_development?pool=25&encoding=unicode&schema_search_path=public
      REDIS_URL: redis://redis:6379

      # Run the app in the 'development' environment:
      RACK_ENV: development
      RAILS_ENV: development
    env_file:
      - ./.env.development

  database:
    image: postgres:9.4-alpine
    ports:
      - 5432

  redis:
    image: redis:3.0.7-alpine
    ports:
      - 6379

  mailcatcher:
    image: voizzzzzz/mailcatcher-alpine
    ports:
      - 1025:1025
      - 1080:1080

Mam wrażenie, że umyka mi jakiś detal. Spotkaliście się z czymś takim albo wiecie może co robię nie tak? Z góry dzięki za pomoc :slight_smile:


Edit: Sorry, jednak wystarczy przebudować obraz. Ale to i tak kiepskie rozwiązanie bo instalowanie gemów od zera zajmuje masę czasu.

Ok, gdyby ktoś miał podobny problem: Wystarczy wywalić z Dockerfile instalacje gemów (bundle install), ustawić BUNDLE_PATH=/box (albo jakąś inną ścieżkę, która nas interesuje) a następnie zamontować /box we wszystkich serwisach. Zmodyfikowane pliki:

Dockerfile

FROM ruby:2.3.3-slim

RUN apt-get update && apt-get install -y \
  build-essential \
  cmake \
  git \
  libpq-dev \
  curl \
  python \
  pkg-config \
  imagemagick

ENV APP_HOME=/app

RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

ENV BUNDLE_GEMFILE=$APP_HOME/Gemfile \
  BUNDLE_PATH=/box

COPY . ./

EXPOSE 3000

CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

HEALTHCHECK CMD curl --fail http://0.0.0.0:3000/healthcheck || exit 1

docker-compose.yml

version: '3'

services:
  app: &app_base
    build:
      context: .
      dockerfile: Dockerfile.dev
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - 3001:3000
    links:
      - database
      - redis
    volumes:
      - .:/app
      - box:/box
    environment: &app_environment
      DATABASE_URL: postgres://postgres@database:5432/nemu_development?pool=25&encoding=unicode&schema_search_path=public
      REDIS_URL: redis://redis:6379

      # Run the app in the 'development' environment:
      RACK_ENV: development
      RAILS_ENV: development
    env_file:
      - ./.env.development

  database:
    image: postgres:9.4-alpine
    ports:
      - 5432

  redis:
    image: redis:3.0.7-alpine
    ports:
      - 6379

  mailcatcher:
    image: voizzzzzz/mailcatcher-alpine
    ports:
      - 1025:1025
      - 1080:1080

  box:
    image: busybox
    volumes:
      - box:/box

volumes:
  box: