ARG ELIXIR_VERSION=1.18.2 ARG OTP_VERSION=27.2 ARG DEBIAN_VERSION=bookworm-20250113-slim ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" FROM ${BUILDER_IMAGE} AS builder # install build dependencies RUN apt-get update -y \ && apt-get install -y \ build-essential \ git \ nodejs \ && apt-get clean \ && rm -f /var/lib/apt/lists/*_* # prepare build dir WORKDIR /app # install hex + rebar RUN mix do local.hex --force, local.rebar --force # set build ENV ARG BUILD_MIX_ENV=prod ENV MIX_ENV=${BUILD_MIX_ENV} # install mix dependencies COPY mix.exs mix.lock ./ RUN mix deps.get --only ${BUILD_MIX_ENV} RUN mkdir config # copy compile-time config files before we compile dependencies # to ensure any relevant config change will trigger the dependencies # to be re-compiled. COPY config/config.exs config/${BUILD_MIX_ENV}.exs config/ RUN mix deps.compile COPY priv priv COPY lib lib COPY assets assets # compile assets RUN mix assets.deploy # Compile the release RUN mix compile # Changes to config/runtime.exs don't require recompiling the code COPY config/runtime.exs config/ COPY rel rel RUN mix release EXPOSE 4000 # start a new build stage so that the final image will only contain # the compiled release and other runtime necessities FROM ${RUNNER_IMAGE} RUN apt-get update -y \ && apt-get install -y \ ca-certificates \ libncurses5 \ libstdc++6 \ locales \ openssl \ tini \ && apt-get clean \ && rm -f /var/lib/apt/lists/*_* # Set the locale RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \ && locale-gen ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 WORKDIR "/app" RUN chown nobody /app # set runner ENV ARG BUILD_MIX_ENV=prod ENV MIX_ENV=${BUILD_MIX_ENV} # Only copy the final release from the build stage COPY --from=builder --chown=nobody:root /app/_build/${BUILD_MIX_ENV}/rel/slax ./ USER nobody # If using an environment that doesn't automatically reap zombie processes, it is # advised to add an init process such as tini via `apt-get install` # above and adding an entrypoint. See https://github.com/krallin/tini for details EXPOSE 4000 ENTRYPOINT ["tini", "--"] CMD ["/app/bin/server"]