ARG NAME=app ARG UID=1000 ARG GID=1000 ARG APP_PORT=3000 ARG INSTALL_DIR=/${NAME} ARG RUBY_VERSION=3.2.5 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 fish ranger pandoc libjemalloc2 && \ apt-get clean && \ npm install tabby-agent && \ 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} ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 USER ${NAME} RUN mkdir -p ~/.config/fish && echo "set fish_greeting" >> ~/.config/fish/config.fish RUN \ echo >> ~/.config/fish/config.fish &&\ echo "function fish_prompt" >> ~/.config/fish/config.fish &&\ echo " set -l last_status \$status" >> ~/.config/fish/config.fish &&\ echo " set -l stat" >> ~/.config/fish/config.fish &&\ echo " if test \$last_status -ne 0" >> ~/.config/fish/config.fish &&\ echo " set stat (set_color red)\"[\$last_status]\"(set_color normal)" >> ~/.config/fish/config.fish &&\ echo " end" >> ~/.config/fish/config.fish &&\ echo " string join '' -- (set_color green) (prompt_pwd) (set_color normal) \$stat ' 🐳 '" >> ~/.config/fish/config.fish && \ echo "end" >> ~/.config/fish/config.fish FROM ruby:${RUBY_VERSION}-alpine AS builder ARG NAME ARG UID ARG GID ARG APP_PORT ARG INSTALL_DIR 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 apk add --update --no-cache \ binutils-gold \ build-base \ curl \ file \ g++ \ gcc \ git \ less \ libstdc++ \ libffi-dev \ libc-dev \ linux-headers \ libxml2-dev \ libxslt-dev \ libgcrypt-dev \ make \ netcat-openbsd \ nodejs \ openssl \ pkgconfig \ tzdata \ yarn \ sqlite \ vips-dev \ npm \ sassc \ jemalloc \ pandoc-cli \ sqlite-libs \ build-base && \ truncate -s 0 /var/log/*log && \ gem update --system && \ bundle config set app_config ${GEM_HOME} ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 USER ${NAME} USER root COPY Gemfile Gemfile.lock package.json yarn.lock ./ RUN bundle config without test development && bundle install && yarn install FROM builder AS assets COPY . . COPY --from=builder ${INSTALL_DIR}/.bundle ${INSTALL_DIR}/.bundle COPY --from=builder ${INSTALL_DIR}/node_modules ${INSTALL_DIR}/node_modules RUN RAILS_ENV=production SECRET_KEY_BASE_DUMMY=1 rails assets:precompile FROM ruby:${RUBY_VERSION}-alpine AS production ARG INSTALL_DIR ARG NAME WORKDIR ${INSTALL_DIR} ENV GEM_HOME=${INSTALL_DIR}/.bundle ENV \ RAILS_ENV=production \ PATH=${INSTALL_DIR}/bin:$GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH \ TZ=Europe/Zurich RUN \ adduser ${NAME} --disabled-password --shell /bin/ash && \ apk add --update --no-cache \ tzdata \ sqlite \ vips-dev \ jemalloc && \ gem update --system && \ bundle config set app_config ${GEM_HOME} && \ bundle config set without development test && \ apk add patchelf && \ patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby && \ apk del patchelf && \ truncate -s 0 /var/log/*log EXPOSE 3000 COPY . . COPY --from=builder ${INSTALL_DIR}/.bundle ${INSTALL_DIR}/.bundle COPY --from=assets ${INSTALL_DIR}/public/assets ${INSTALL_DIR}/public/assets RUN chown -R ${NAME}:${NAME} ${INSTALL_DIR}/tmp ${INSTALL_DIR}/log ${INSTALL_DIR}/storage && \ date +"%Y-%m-%d %H:%M:%S %Z" >> .build_version USER ${NAME} ENTRYPOINT [ "bin/entrypoint" ] CMD [ "rails", "server", "--binding", "0.0.0.0", "--no-daemon", "--port" , "3000" ]