使用docker-compose捆绑从头开始安装宝石

时间:2018-04-01 15:22:31

标签: ruby-on-rails docker docker-compose bundle bundler

我试图在Docker构建上缓存bundle install。 我已尝试过几篇博客文章中的建议,我最终得到了类似的结果:

Dockerfile:

FROM ruby:2.5.0-alpine

RUN apk update && apk add build-base postgresql-dev nodejs git tzdata

ENV APP_HOME /panabus-api
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

COPY Gemfile Gemfile.lock ./
ENV BUNDLE_PATH /gems
ENV GEM_PATH /gems
ENV GEM_HOME /gems

RUN bundle check || bundle install

COPY . $APP_HOME

ENV RAILS_ENV=production

RUN bundle exec rake RAILS_ENV=production assets:precompile apipie:cache

LABEL maintainer="Hari Carreras Pérez <hc@abtion.com>"

CMD bundle exec puma -C config/puma.rb

搬运工-compose.yml

version: '3'
services:
  box:
    image: busybox
    volumes:
      - gem_cache:/gems

  postgres:
    image: postgres:10.3-alpine
    ports:
      - 5432:5432
    volumes:
      - postgres:/var/lib/postgresql/data
    restart: always

  web:
    build: .
    image: panabus-api-web
    command: bundle exec puma -C config/puma.rb -p 3000
    depends_on:
      - postgres
      - box
    volumes:
      - .:/panabus-api
      - gem_cache:/gems
    ports:
      - "3000:3000"
    restart: always
    environment:
      - RAILS_ENV=development
    tty: true
    stdin_open: true

  setup:
    build: .
    depends_on:
      - postgres
      - box
    environment:
      - RAILS_ENV=development
    volumes:
      - .:/panabus-api
      - gem_cache:/gems
    command: "bin/rails db:create db:migrate"
volumes:
  postgres:
  gem_cache:

如果Gemfile没有改变,这不会更新宝石。不幸的是,如果它已经改变,它会从头开始安装所有宝石,而不是使用缓存。

有没有办法在构建时缓存宝石? 我想在Dockerfile中保留bundle,因为Heroku使用相同的Dockerfile。

1 个答案:

答案 0 :(得分:0)

您需要在捆绑包中添加标签,以检查已安装宝石的缓存位置

bundle check || bundle install --binstubs="$BUNDLE_BIN"

并使用类似的路径缓存分发包

ENV BUNDLE_PATH=/bundle \
  BUNDLE_BIN=/bundle/bin \
  GEM_HOME=/bundle
ENV PATH="${BUNDLE_BIN}:${PATH}"