From 94e8d928dbf0975aad8ee15a3796a79372ecff6b Mon Sep 17 00:00:00 2001 From: tsoganov Date: Wed, 2 Apr 2025 12:46:54 +0300 Subject: [PATCH] Added Dockerfile for production and updated gemfile --- Dockerfile.production | 107 ++++++++++++++++++++++++++++++++++++++++++ Gemfile | 1 + Gemfile.lock | 1 + 3 files changed, 109 insertions(+) create mode 100644 Dockerfile.production diff --git a/Dockerfile.production b/Dockerfile.production new file mode 100644 index 000000000..51e3e2084 --- /dev/null +++ b/Dockerfile.production @@ -0,0 +1,107 @@ +# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile +ARG RUBY_VERSION=3.0.3 +ARG TARGETPLATFORM=linux/amd64 +FROM --platform=${TARGETPLATFORM} registry.docker.com/library/ruby:$RUBY_VERSION-slim AS base + +# Rails app lives here +WORKDIR /opt/webapps/app + +# Set production environment +ENV RAILS_ENV="production" \ + RAILS_LOG_TO_STDOUT=true \ + BUNDLE_DEPLOYMENT="1" \ + BUNDLE_PATH="/usr/local/bundle" + +# Throw-away build stage to reduce size of final image +FROM base AS build + +# Install packages needed to build gems and node modules +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y \ + build-essential \ + imagemagick=* \ + shared-mime-info \ + zip \ + unzip \ + curl \ + git \ + gnupg2 \ + libpq-dev \ + libxslt1-dev \ + libxml2-dev \ + libzip-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install JavaScript dependencies +ARG NODE_VERSION=14.21.3 +ENV PATH=/usr/local/node/bin:$PATH +RUN curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz -C /tmp/ && \ + /tmp/node-build-master/bin/node-build "${NODE_VERSION}" /usr/local/node && \ + rm -rf /tmp/node-build-master + +# Set up locale +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen +RUN sed -i -e 's/# et_EE.UTF-8 UTF-8/et_EE.UTF-8 UTF-8/' /etc/locale.gen && \ + dpkg-reconfigure --frontend=noninteractive locales && \ + update-locale LANG=et_EE.UTF-8 +ENV LANG=et_EE.UTF-8 + +# Install application gems +COPY Gemfile Gemfile.lock ./ +RUN gem install bundler && \ + bundle config set --local without 'development test' && \ + bundle install && \ + bundle clean --force + +# Copy application code +COPY . . + +# Precompile assets +RUN RAILS_ENV=production bundle exec rake assets:precompile + +# Final stage for app image +FROM base + +# Install packages needed for deployment +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y \ + curl \ + postgresql-client \ + imagemagick=* \ + shared-mime-info \ + libpq-dev \ + locales \ + curl \ + zip \ + unzip \ + libzip-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Set up locale +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen +RUN sed -i -e 's/# et_EE.UTF-8 UTF-8/et_EE.UTF-8 UTF-8/' /etc/locale.gen && \ + dpkg-reconfigure --frontend=noninteractive locales && \ + update-locale LANG=et_EE.UTF-8 +ENV LANG=et_EE.UTF-8 + +# Copy built artifacts: gems, application +COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}" +COPY --from=build /opt/webapps/app /opt/webapps/app + +# Run and own only the runtime files as a non-root user for security +RUN groupadd --system --gid 1000 rails && \ + useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \ + chown -R rails:rails db log tmp +USER 1000:1000 + +# Entrypoint prepares the database. +# ENTRYPOINT ["/opt/webapps/app/bin/docker-entrypoint"] + +# Expose port +EXPOSE 3000 + +# Start the application +CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"] \ No newline at end of file diff --git a/Gemfile b/Gemfile index 241eeda24..44f15471b 100644 --- a/Gemfile +++ b/Gemfile @@ -10,6 +10,7 @@ gem 'mime-types-data' gem 'puma' gem 'rails', '~> 6.1.4' gem 'rest-client' +gem 'rubyzip', require: 'zip' gem 'uglifier' # load env diff --git a/Gemfile.lock b/Gemfile.lock index 51bd77843..ae45abe46 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -623,6 +623,7 @@ DEPENDENCIES redis rest-client rexml + rubyzip sass-rails select2-rails (= 4.0.13) selectize-rails (= 0.12.6)