# syntax = docker/dockerfile:1 # Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile ARG RUBY_VERSION=<%= RUBY_VERSION %> <% if api_client_dir -%> <%= render partial: 'node_client' %> <% end -%> <% if options.fullstaq -%> FROM quay.io/evl.ms/fullstaq-ruby:${RUBY_VERSION}-<%= @options.jemalloc ? 'jemalloc-' : '' %>slim as base <% else -%> FROM ruby:$RUBY_VERSION-slim as base <% end -%> # Rails app lives here WORKDIR /rails # Set production environment ENV RAILS_ENV="production" \ BUNDLE_PATH="vendor/bundle" \ BUNDLE_WITHOUT="<%= options.ci? ? 'test' : 'development:test' %>" ARG BUNDLER_VERSION=<%= Bundler::VERSION %> RUN gem update --system --no-document && \ gem install -N bundler -v ${BUNDLER_VERSION} # Throw-away build stage<%= parallel? ? 's' : '' %> to reduce size of final image FROM base as <%= parallel? ? 'pre' : '' %>build # Install packages need to build gems<%= using_node? ? " and node modules" : "" %> <% if options.cache? %> RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \ --mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \ apt-get update -qq && \ <% else -%> RUN apt-get update -qq && \ <% end -%> apt-get install -y <%= build_packages.join(" ") %> <% if parallel? -%> FROM prebuild as node <% end -%> <% if using_node? -%> # Install JavaScript dependencies ARG NODE_VERSION=<%= node_version %> ARG YARN_VERSION=<%= yarn_version %> RUN curl -fsSL https://fnm.vercel.app/install | bash && \ /root/.local/share/fnm/fnm install $NODE_VERSION ENV PATH=/root/.local/share/fnm/aliases/default/bin/:$PATH RUN npm install -g yarn@$YARN_VERSION <% end -%> <% if parallel? -%> # Install node modules COPY package.json yarn.lock ./ <% if options.cache? -%> RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \ YARN_CACHE_FOLDER=/root/.yarn yarn install <% else -%> RUN yarn install <% end -%> FROM prebuild as build <% end -%> # Install application gems COPY Gemfile Gemfile.lock ./ <% if options.cache? -%> RUN --mount=type=cache,id=bld-gem-cache,sharing=locked,target=/srv/vendor \ bundle config set app_config .bundle && \ bundle config set path /srv/vendor && \ bundle _${BUNDLER_VERSION}_ install && \ <% if depend_on_bootsnap? -%> && \ bundle exec bootsnap precompile --gemfile && \ <% end -%> bundle clean && \ mkdir -p vendor && \ bundle config set path vendor && \ cp -ar /srv/vendor . <% else -%> RUN bundle _${BUNDLER_VERSION}_ install<% if depend_on_bootsnap? -%> && \ bundle exec bootsnap precompile --gemfile <% end -%> <% end -%> <% if parallel? -%> asdf <% elsif using_node? -%> # Install node modules COPY package.json yarn.lock ./ <% if options.cache? -%> RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \ YARN_CACHE_FOLDER=/root/.yarn yarn install <% else -%> RUN yarn install <% end -%> <% end -%> # Copy application code COPY . . <% if depend_on_bootsnap? -%> # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile app/ lib/ <% end -%> <% unless binfile_fixups.empty? -%> # Adjust binfiles to be executable on Linux <%= "RUN " + binfile_fixups.join(" && \\\n ") %> <% end -%> <% unless api_only? -%> # Precompiling assets for production without requiring secret RAILS_MASTER_KEY RUN SECRET_KEY_BASE<%= Rails::VERSION::MAJOR<7 || Rails::VERSION::STRING.start_with?('7.0') ? '=DUMMY' : '_DUMMY=1' %> ./bin/rails assets:precompile <% end -%> # Final stage for app image FROM base <% unless deploy_packages.empty? -%> # Install packages need for deployment <% if options.cache? -%> RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \ --mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \ apt-get update -qq && \ apt-get install --no-install-recommends -y <%= deploy_packages.join(" ") %> <% else -%> RUN apt-get update -qq && \ apt-get install --no-install-recommends -y <%= deploy_packages.join(" ") %> && \ rm -rf /var/lib/apt/lists /var/cache/apt/archives <% end -%> <% end -%> # Copy built application from previous stage <% if options.ci? -%> COPY --from=build /usr/local/bundle /usr/local/bundle <% end -%> COPY --from=build /rails /rails <% if api_client_dir -%> # Copy built client COPY --from=client /rails/<%= api_client_dir %>/build /rails/public <% end -%> # Deployment options ENV RAILS_LOG_TO_STDOUT="1" \ RAILS_SERVE_STATIC_FILES="true"<% if options.yjit %> \ RUBY_YJIT_ENABLE="1"<% end %><% if options.jemalloc and not options.fullstaq %> \ LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2" \ MALLOC_CONF="dirty_decay_ms:1000,narenas:2,background_thread:true"<% end %> # Entrypoint prepares the database. ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start the server by default, this can be overwritten at runtime EXPOSE 3000 CMD ["./bin/rails", "server"]