# pre-build stage FROM ruby:2.7.0-alpine AS pre-builder # ARG default to production settings # For development docker-compose file overrides ARGS ARG BUNDLE_WITHOUT="development:test" ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT} ENV BUNDLER_VERSION=2.1.2 ARG RAILS_SERVE_STATIC_FILES=true ENV RAILS_SERVE_STATIC_FILES ${RAILS_SERVE_STATIC_FILES} ARG RAILS_ENV=production ENV RAILS_ENV ${RAILS_ENV} ENV BUNDLE_PATH="/gems" RUN apk update \ && apk add \ openssl \ tar \ build-base \ tzdata \ postgresql-dev \ postgresql-client \ nodejs \ yarn \ git \ && mkdir -p /var/app \ && gem install bundler RUN mkdir -p /app WORKDIR /app COPY Gemfile Gemfile.lock ./ # Do not install development or test gems in production RUN if [ "$RAILS_ENV" = "production" ]; then \ bundle install -j 4 -r 3 --without development test; \ else bundle install -j 4 -r 3; \ fi COPY package.json yarn.lock ./ RUN yarn install COPY . /app # generate production assets if production environment RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=precompile_placeholder RAILS_LOG_TO_STDOUT=enabled bundle exec rake assets:precompile; \ fi # final build stage FROM ruby:2.7.0-alpine ARG BUNDLE_WITHOUT="development:test" ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT} ENV BUNDLER_VERSION=2.1.2 ARG EXECJS_RUNTIME="Disabled" ENV EXECJS_RUNTIME ${EXECJS_RUNTIME} ARG RAILS_SERVE_STATIC_FILES=true ENV RAILS_SERVE_STATIC_FILES ${RAILS_SERVE_STATIC_FILES} ARG RAILS_ENV=production ENV RAILS_ENV ${RAILS_ENV} ENV BUNDLE_PATH="/gems" RUN apk add --update --no-cache \ openssl \ tzdata \ postgresql-client \ imagemagick \ && gem install bundler RUN if [ "$RAILS_ENV" = "production" ]; then \ rm -rf spec node_modules app/assets vendor/assets tmp/cache; \ else apk add nodejs yarn; \ fi COPY --from=pre-builder /gems/ /gems/ COPY --from=pre-builder /app /app # Remove unecessary files RUN rm -rf /gems/ruby/2.7.0/cache/*.gem \ && find /gems/ruby/2.7.0/gems/ -name "*.c" -delete \ && find /gems/ruby/2.7.0/gems/ -name "*.o" -delete WORKDIR /app