ARG NAME=app ARG UID=1000 ARG GID=1000 ARG APP_PORT=3000 ARG INSTALL_DIR=/${NAME} ARG RUBY_VERSION=3.3.4 FROM ruby:${RUBY_VERSION} AS development ARG NAME ARG UID ARG GID ARG APP_PORT ARG INSTALL_DIR LABEL maintainer='david@hohl.cloud' WORKDIR ${INSTALL_DIR} ENV GEM_HOME=${INSTALL_DIR}/.bundle ENV \ LANG=C.UTF-8 \ INSTALL_DIR=${INSTALL_DIR} \ RAILS_ENV=development \ TZ=Europe/Zurich \ PATH=${INSTALL_DIR}/bin:$GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH \ EDITOR=vim RUN \ ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \ echo $TZ > /etc/timezone && \ addgroup --gid ${GID} ${NAME} && \ adduser \ --gecos GECOS \ --home /home/${NAME} \ --uid ${UID} \ --gid ${GID} \ --disabled-password \ --disabled-login \ --shell /bin/bash \ ${NAME} && \ apt-get update && \ apt-get install -yqq --no-install-recommends \ gnupg2 \ curl && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update -yqq && \ apt-get install -yqq --no-install-recommends \ sqlite3 nodejs npm sassc yarn libvips && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \ truncate -s 0 /var/log/*log && \ gem update --system && \ bundle config set app_config ${GEM_HOME} FROM development AS builder COPY Gemfile Gemfile.lock package.json yarn.lock ./ RUN bundle install && yarn install FROM builder AS assets COPY . . COPY --from=builder /app/.bundle /app/.bundle COPY --from=builder /app/node_modules /app/node_modules RUN RAILS_ENV=production SECRET_KEY_BASE_DUMMY=1 rails assets:precompile FROM ruby:${RUBY_VERSION}-slim AS production ARG NAME ARG UID ARG GID ARG APP_PORT ARG INSTALL_DIR WORKDIR ${INSTALL_DIR} ENV \ LANG=C.UTF-8 \ INSTALL_DIR=${INSTALL_DIR} \ RAILS_ENV=production \ TZ=Europe/Zurich \ PATH=${INSTALL_DIR}/bin:$GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH ENV GEM_HOME=${INSTALL_DIR}/.bundle RUN \ ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \ echo $TZ > /etc/timezone && \ addgroup --gid ${GID} ${NAME} && \ adduser \ --gecos GECOS \ --home /home/${NAME} \ --uid ${UID} \ --gid ${GID} \ --disabled-password \ --disabled-login \ --shell /bin/bash \ ${NAME} && \ apt-get update -yqq && \ apt-get install -yqq --no-install-recommends \ sqlite3 libvips && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \ truncate -s 0 /var/log/*log && \ gem update --system && \ bundle config set app_config ${GEM_HOME} EXPOSE 3000 ENTRYPOINT [ "bin/entrypoint" ] COPY . . COPY --from=builder /app/.bundle /app/.bundle COPY --from=assets /app/public/assets /app/public/assets RUN chown -R app:app /app/tmp /app/log /app/storage USER app # Using variables in command list is not possible: # https://stackoverflow.com/questions/40454470/how-can-i-use-a-variable-inside-a-dockerfile-cmd CMD [ "rails", "server", "--binding", "0.0.0.0", "--no-daemon", "--port" , "3000" ]