I use `podman` by preference when working with Dockerfiles, as I find its rootless mode of operation less invasive. It has different defaults in handling short names of images, which interestingly work for node images, but not Ruby. However, while looking into this, I saw the config file in `/etc/containers/registries.conf` advises use of fully qualified image names, so I adjust node to use full qualification as well.
51 lines
1.6 KiB
Docker
51 lines
1.6 KiB
Docker
FROM docker.io/library/node:23.6-alpine3.21 AS frontend-builder
|
|
WORKDIR /app
|
|
COPY tailwind.config.js package.json package-lock.json ./
|
|
COPY views/ ./views/
|
|
COPY assets/ ./assets/
|
|
RUN npm ci
|
|
RUN npm run prod
|
|
|
|
|
|
FROM docker.io/library/ruby:3.2.7-alpine3.21 AS bundler
|
|
# Install build dependencies
|
|
# - build-base, git, curl: To ensure certain gems can be compiled
|
|
# - postgresql-dev: Required for postgresql gem
|
|
RUN apk update --no-cache && \
|
|
apk add build-base git curl postgresql-dev libffi-dev --no-cache
|
|
WORKDIR /app
|
|
COPY Gemfile Gemfile.lock ./
|
|
|
|
RUN bundle install
|
|
|
|
|
|
FROM docker.io/library/ruby:3.2.7-alpine3.21
|
|
# Install runtime dependencies
|
|
# - tzdata: The public-domain time zone database
|
|
# - curl: Required for healthcheck and some basic operations
|
|
# - postgresql-client: Required for postgresql gem at runtime
|
|
# - gcompat: Required for nokogiri gem at runtime. https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library
|
|
# - foreman: Helps to start different parts of app based on Procfile
|
|
RUN apk update --no-cache && \
|
|
apk add tzdata curl postgresql-client gcompat libffi --no-cache && \
|
|
gem install foreman
|
|
|
|
RUN adduser -D ubicloud && \
|
|
mkdir /app && \
|
|
chown ubicloud:ubicloud /app
|
|
# Don't use root to run our app as extra line of defense
|
|
USER ubicloud
|
|
WORKDIR /app
|
|
|
|
# Copy built assets from builders
|
|
COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/
|
|
COPY --chown=ubicloud --from=frontend-builder /app/assets/css/app.css /app/assets/css/app.css
|
|
COPY --chown=ubicloud . /app
|
|
|
|
ENV RACK_ENV=production
|
|
ENV PORT=3000
|
|
|
|
EXPOSE 3000
|
|
|
|
CMD ["foreman", "start"]
|