我试图在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。
答案 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}"