diff --git a/.dockerignore b/.dockerignore
index 9d969004f07bb09475718c51d178b057f992cca3..78765505cc78bf8355577dcfa73dd30af493978f 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -4,26 +4,31 @@
 README.md
 SECURITY.md
 .github
+.gitlab-ci.yml
+.rvmrc
 
 # Rails
 .env*
 *.rbc
 capybara-*.html
 .rspec
-log
-tmp
+**/.bundle/
+*.dev
+.rubocop.yml
+log/*
+tmp/*
+storage/*
 /db/**/*.sqlite3
 /db/**/*.sqlite3-journal
 /db/production
 /db/production-postgres
-public/assets
-public/b
+public/**/assets/
 coverage/
-.rvmrc
-vendor/bundle
-.bundle
-Dockerfile
-.gitlab-ci.yml
-.rubocop.yml
-spec
-test
+vendor/*
+Dockerfile*
+spec/
+test/
+**/node_modules/
+app/assets/builds/*
+dockerfiles/
+!**/.keep
diff --git a/Dockerfile b/Dockerfile
index 82d7b1ab12a1715276f7e38a037a48f4c44acc75..f7687b5fed4d4f786769a3894fe6754e6147e190 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,56 +1,46 @@
-FROM alpine:3.17 AS alpine
+FROM ruby:alpine3.17 AS base
 
 ARG RAILS_ROOT=/usr/src/app
 ENV RAILS_ROOT=${RAILS_ROOT}
-
-FROM alpine AS base
-WORKDIR $RAILS_ROOT
-RUN apk add --no-cache \
-    libpq \
-    libxml2 \
-    libxslt \
-    ruby \
-    ruby-irb \
-    ruby-bigdecimal \
-    ruby-bundler \
-    ruby-json \
-    tzdata \
-    bash \
-    shared-mime-info
-
-FROM base
-RUN apk add --no-cache \
-    build-base \
-    curl-dev \
-    git \
-    gettext \
-    imagemagick \
-    libxml2-dev \
-    libxslt-dev \
-    pkgconf \
-    postgresql-dev \
-    ruby-dev \
-    nodejs npm \
-    yarn \
-    yaml-dev \
-    zlib-dev \
-    && ( echo 'install: --no-document' ; echo 'update: --no-document' ) >>/etc/gemrc
-COPY . ./
-RUN bundle install -j4 \
-    && yarn install
-
 ARG RAILS_ENV
 ENV RAILS_ENV=${RAILS_ENV:-production}
+ARG NODE_ENV
+ENV NODE_ENV=${RAILS_ENV}
 ARG RAILS_LOG_TO_STDOUT
 ENV RAILS_LOG_TO_STDOUT=${RAILS_LOG_TO_STDOUT:-true}
 ARG RAILS_SERVE_STATIC_FILES
 ENV RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES:-true}
 ARG PORT
 ENV PORT=${PORT:-3000}
-
-EXPOSE ${PORT}
-
 ARG VERSION_TAG
 ENV VERSION_TAG=$VERSION_TAG
+ENV PATH=$PATH:$RAILS_ROOT/bin
+WORKDIR $RAILS_ROOT
+RUN bundle config --local deployment 'true' \
+    && bundle config --local without 'development:test'
+
+FROM base as build
+
+ARG PACKAGES='alpine-sdk libpq-dev'
+COPY Gemfile Gemfile.lock ./
+RUN apk update \
+    && apk add --update --no-cache ${PACKAGES} \
+    && bundle install --no-cache \
+    && bundle doctor
+
+FROM base as prod
 
+ARG PACKAGES='libpq-dev tzdata imagemagick yarn bash'
+COPY --from=build $RAILS_ROOT/vendor/bundle ./vendor/bundle
+COPY package.json yarn.lock ./
+RUN apk update \
+    && apk add --update --no-cache ${PACKAGES} \
+    && yarn install --production --frozen-lockfile \
+    && yarn cache clean
+COPY . ./
+RUN apk update \
+    && apk upgrade \
+    && update-ca-certificates
+
+EXPOSE ${PORT}
 ENTRYPOINT [ "./bin/start" ]