# 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"]