# ----- Build Stage ----- # Using a specific Ruby version (e.g., 3.3) for stability ARG RUBY_VERSION=3.3.9 FROM ruby:$RUBY_VERSION as builder # Install system dependencies needed for Ruby gems and asset building RUN apt-get update -qq && apt-get install -y \ build-essential \ libpq-dev \ libvips \ nodejs \ npm \ git \ curl \ watchman \ && rm -rf /var/lib/apt/lists/* \ # For TailwindCSS, install the npm package instead of relying on the system executable # as there have been issues with architecture mismatches in containers && npm install -g tailwindcss # Set the working directory inside the container WORKDIR /usr/src/app # Copy and install Ruby dependencies COPY Gemfile Gemfile.lock ./ RUN bundle install # Copy the rest of the application code COPY . . # Precompile assets for production using the installed Tailwind CLI # This uses the installed 'tailwindcss' executable rather than the gem's wrapper # RUN bundle exec rails assets:precompile # ----- Production Stage ----- # Use a smaller Ruby image for the final production build FROM ruby:$RUBY_VERSION-slim # Install production system dependencies RUN --mount=type=cache,target=/var/cache/apt \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ --mount=type=tmpfs,target=/var/log \ rm -f /etc/apt/apt.conf.d/docker-clean; \ apt-get update -qq \ && apt-get install -yq --no-install-recommends \ build-essential \ less \ git \ tdsodbc \ freetds-dev \ libvips \ libpq-dev ENV LANG=C.UTF-8 \ BUNDLE_JOBS=4 \ BUNDLE_RETRY=3 WORKDIR /usr/src/app # Copy runtime Ruby dependencies and the precompiled assets from the builder stage COPY --from=builder /usr/local/bundle /usr/local/bundle COPY --from=builder /usr/src/app /usr/src/app COPY --from=builder /usr/local/bin/watchman /usr/local/bin/watchman COPY --from=builder /usr/local/bin/watchman-wait /usr/local/bin/watchman-wai # The entrypoint script is a good practice for handling Rails server startup ENTRYPOINT ["./bin/docker-entrypoint-development"] # Expose the application port EXPOSE 3002 # Set the default command to run the Rails server CMD ["./bin/rails", "server"]