ezcontainer_example/Dockerfile
2023-10-27 12:27:35 -04:00

69 lines
1.8 KiB
Docker

# Use an official Elixir runtime as a parent image
FROM elixir:1.15.6-slim AS build
# Set the environment to production
ENV MIX_ENV=prod
# Install system dependencies
RUN apt-get update && \
apt-get install -y build-essential sqlite3 libsqlite3-dev && \
apt-get clean
# Install hex and rebar
RUN mix local.hex --force && \
mix local.rebar --force
# Create the application build directory
WORKDIR /app
# Copy our mix files and fetch our dependencies
COPY mix.exs mix.lock ./
COPY config config
RUN mix do deps.get, deps.compile
# Set Node.js environment to production
ENV NODE_ENV=production
# Use Node.js to install assets
FROM node:20 AS node-build
WORKDIR /app/assets
COPY assets .
RUN npm install -g pnpm
RUN pnpm install
# Switch back to our Elixir image to continue building
FROM build AS app-build
WORKDIR /app
RUN mix phx.digest
# Copy our application source code
COPY --from=node-build /app/assets assets
COPY lib lib
COPY priv priv
# Compile and build the application
RUN mix do compile, phx.digest, assets.deploy, ecto.create, ecto.migrate
# Create the release
RUN mix phx.gen.release
RUN mix release
# ---- Application Stage ----
FROM elixir:1.15.6-slim AS app
# Install runtime dependencies
RUN apt-get update && apt-get install -y openssl libssl-dev libsqlite3-0 && apt-get clean
# Create and switch to the app user
RUN useradd --create-home app
USER app
WORKDIR /home/app
# Copy over the build artifact from the previous step and create a symlink
COPY --from=app-build --chown=app:app /app/_build/prod/rel/ezcontainer_railway ./
COPY --from=app-build --chown=app:app /app/_build/prod/lib/ezcontainer_railway/priv/static priv/static
COPY --from=app-build --chown=app:app /app/db ./db
# Specify the entry point
ENTRYPOINT ["/home/app/bin/ezcontainer_railway", "start"]