103 lines
3.1 KiB
Docker
103 lines
3.1 KiB
Docker
FROM ruby:3.2 AS builder
|
|
|
|
RUN apt-get update && apt-get upgrade -y && apt-get install -y ca-certificates curl gnupg && \
|
|
curl -fsSL https://deb.nodesource.com/setup_21.x | bash - && \
|
|
apt-get install -y \
|
|
build-essential \
|
|
nodejs \
|
|
postgresql-client \
|
|
libpq-dev && \
|
|
apt-get clean
|
|
|
|
# throw errors if Gemfile has been modified since Gemfile.lock
|
|
RUN bundle config --global frozen 1
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy package dependencies files only to ensure maximum cache hit
|
|
COPY ./Gemfile /app/Gemfile
|
|
COPY ./Gemfile.lock /app/Gemfile.lock
|
|
|
|
RUN gem install bundler:$(grep -A 1 'BUNDLED WITH' Gemfile.lock | tail -n 1 | xargs) && \
|
|
bundle config --local without 'development test' && \
|
|
bundle install -j4 --retry 3 && \
|
|
# Remove unneeded gems
|
|
bundle clean --force && \
|
|
# Remove unneeded files from installed gems (cache, *.o, *.c)
|
|
rm -rf /usr/local/bundle/cache && \
|
|
find /usr/local/bundle/ -name "*.c" -delete && \
|
|
find /usr/local/bundle/ -name "*.o" -delete && \
|
|
find /usr/local/bundle/ -name ".git" -exec rm -rf {} + && \
|
|
find /usr/local/bundle/ -name ".github" -exec rm -rf {} + && \
|
|
find /usr/local/bundle/ -name "spec" -exec rm -rf {} +
|
|
|
|
# copy the rest of files
|
|
COPY ./app /app/app
|
|
COPY ./bin /app/bin
|
|
COPY ./config /app/config
|
|
COPY ./db /app/db
|
|
COPY ./lib /app/lib
|
|
COPY ./public/*.* /app/public/
|
|
COPY ./config.ru /app/config.ru
|
|
COPY ./Rakefile /app/Rakefile
|
|
|
|
# Compile assets
|
|
#
|
|
# For an app using encrypted credentials, Rails raises a `MissingKeyError`
|
|
# if the master key is missing. Because on CI there is no master key,
|
|
# we hide the credentials while compiling assets (by renaming them before and after)
|
|
#
|
|
RUN mv config/credentials.yml.enc config/credentials.yml.enc.bak 2>/dev/null || true
|
|
RUN mv config/credentials config/credentials.bak 2>/dev/null || true
|
|
|
|
RUN RAILS_ENV=production \
|
|
SECRET_KEY_BASE=dummy \
|
|
RAILS_MASTER_KEY=dummy \
|
|
DB_ADAPTER=nulldb \
|
|
ASSETS_PRECOMPILE=true \
|
|
STORAGE_PROVIDER=local \
|
|
bundle exec rails assets:precompile
|
|
|
|
RUN mv config/credentials.yml.enc.bak config/credentials.yml.enc 2>/dev/null || true
|
|
RUN mv config/credentials.bak config/credentials 2>/dev/null || true
|
|
|
|
RUN rm -rf tmp/cache vendor/bundle test spec .git
|
|
|
|
# This image is for production env only
|
|
FROM ruby:3.2-slim AS final
|
|
|
|
RUN apt-get update && \
|
|
apt-get install -y postgresql-client \
|
|
imagemagick \
|
|
libvips \
|
|
curl \
|
|
supervisor && \
|
|
apt-get clean
|
|
|
|
EXPOSE 3000
|
|
|
|
ENV RAILS_LOG_TO_STDOUT true
|
|
ENV RAILS_SERVE_STATIC_FILES true
|
|
ENV RAILS_ENV production
|
|
|
|
ARG RUN_RAILS
|
|
ARG RUN_SIDEKIQ
|
|
|
|
# Add user
|
|
RUN addgroup --system --gid 1000 app && \
|
|
adduser --system --uid 1000 --home /app --group app
|
|
|
|
WORKDIR /app
|
|
COPY ./entrypoint.sh /app/entrypoint.sh
|
|
COPY ./supervisord.conf /etc/supervisord.conf
|
|
COPY --from=builder --chown=app:app /usr/local/bundle/ /usr/local/bundle/
|
|
COPY --from=builder --chown=app:app /app /app
|
|
|
|
USER app
|
|
HEALTHCHECK --interval=1m --timeout=5s --start-period=10s \
|
|
CMD (curl -IfSs http://localhost:3000/ -A "HealthCheck: Docker/1.0") || exit 1
|
|
|
|
|
|
ENTRYPOINT ["/app/entrypoint.sh"]
|
|
CMD ["/usr/bin/supervisord"]
|