FROM ruby:2.6.3-alpine AS base ARG BUILD_PACKAGES="build-base git" ARG DEV_PACKAGES="postgresql-dev nodejs yarn" ARG RUBY_PACKAGES="tzdata" # Add git to clone Rspec repositories and build-base to compile nokogiri gem # Additionally, we need to set timezone information RUN apk add --update --no-cache $BUILD_PACKAGES $DEV_PACKAGES $RUBY_PACKAGES # Make an app directory, just like Heroku. RUN mkdir /app WORKDIR /app ################################################################################ FROM base AS builder # Copying the Gemfile separately allows the image to be cached. # These steps are not rerun unless the Gemfile or Gemfile.lock is changed. COPY Gemfile Gemfile.lock /app/ RUN bundle install --jobs 4 --retry 5 --without development test # Again, copy seperately so we can cache this step. COPY package.json yarn.lock /app/ RUN yarn install # Copy our app over now COPY . /app # And compile our assets, removing unneeded node_modules directory afterwards RUN rails assets:precompile && \ rm -rf node_modules tmp/cache app/assets vendor/assets spec # Copy the docker configurations over COPY config/database.yml.docker config/database.yml ################################################################################ # We want a tiny image, so don't start from base FROM ruby:2.6.3-alpine AS prod ENV RAILS_ENV=production RUN apk add --update --no-cache $RUBY_PACKAGES # Grab everything from the builder COPY --from=builder /usr/local/bundle/ /usr/local/bundle/ COPY --from=builder /app/ /app/ # Run the server EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"]