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"]