ARG RUBY_VERSION=2.7.2 ## BUILD ENV FROM ruby:${RUBY_VERSION}-alpine AS build_env ARG BUILD_PACKAGES="build-base curl-dev git" ARG DEV_PACKAGES="sqlite-dev" ARG RUBY_PACKAGES="tzdata" ARG RAILS_ROOT=/app ENV RAILS_ENV=production ENV BUNDLE_APP_CONFIG="$RAILS_ROOT/.bundle" WORKDIR $RAILS_ROOT # install packages RUN apk update \ && apk upgrade \ && apk add --update --no-cache $BUILD_PACKAGES $DEV_PACKAGES $RUBY_PACKAGES # copy app and cleanup dev environment in case this is not a clean git clone COPY . . RUN rm -rf .bundle vendor .vendor tmp/* db/*.sqlite3 log/* spec # install gems RUN gem install bundler:2.2.9 \ && bundle config --global frozen 1 \ && bundle config --local path 'vendor/bundle' \ && bundle config set without 'development:test:assets' \ && bundle install -j4 --retry 3 \ # Remove unneeded files (cached *.gem, *.o, *.c) && rm -rf vendor/bundle/ruby/*/cache/*.gem \ && find vendor/bundle/ruby/*/gems/ -name "*.c" -delete \ && find vendor/bundle/ruby/*/gems/ -name "*.o" -delete # remove folders not needed in resulting image RUN rm -rf tmp/cache app/assets vendor/assets spec docker ## DEPLOY ENV FROM ruby:${RUBY_VERSION}-alpine ARG PACKAGES="tzdata sqlite-libs" ARG RAILS_ROOT=/app ENV RAILS_ENV=production ENV BUNDLE_APP_CONFIG="$RAILS_ROOT/.bundle" ARG USER_UID=12001 ARG USER_GID=12001 ARG GROUP_NAME=ryndns ARG USER_NAME=ryndns WORKDIR $RAILS_ROOT # make user RUN set -eux; \ addgroup -g $USER_UID $GROUP_NAME; \ adduser -u $USER_UID -G $GROUP_NAME -s /sbin/nologin -D $USER_NAME; # install packages RUN apk update \ && apk upgrade \ && apk add --update --no-cache $PACKAGES # get app from build env and add entrypoint COPY --from=build_env $RAILS_ROOT $RAILS_ROOT COPY ./docker/files/entrypoint.sh / # create persistent folder and change permission of app RUN mkdir -p $RAILS_ROOT/data \ && chown -R $USER_NAME:$GROUP_NAME $RAILS_ROOT USER $USER_NAME EXPOSE 3000 ENTRYPOINT ["/entrypoint.sh"]