diff --git a/.dockerignore b/.dockerignore index 61a7393..5d2adff 100644 --- a/.dockerignore +++ b/.dockerignore @@ -40,6 +40,7 @@ erl_crash.dump # Static artifacts - These should be fetched and built inside the Docker image +# https://hexdocs.pm/phoenix/Mix.Tasks.Phx.Gen.Release.html#module-docker /assets/node_modules/ /priv/static/assets/ /priv/static/cache_manifest.json diff --git a/Dockerfile b/Dockerfile index 8af7b08..14f7ea0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,35 +1,36 @@ # Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian # instead of Alpine to avoid DNS resolution issues in production. # -# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu -# https://hub.docker.com/_/ubuntu?tab=tags +# https://hub.docker.com/r/hexpm/elixir/tags?name=ubuntu +# https://hub.docker.com/_/ubuntu/tags # # This file is based on these images: # # - https://hub.docker.com/r/hexpm/elixir/tags - for the build image -# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20250721-slim - for the release image +# - https://hub.docker.com/_/debian/tags?name=bookworm-20251117-slim - for the release image # - https://pkgs.org/ - resource for finding needed packages -# - Ex: hexpm/elixir:1.18.4-erlang-28.0.2-debian-bullseye-20250721-slim +# - Ex: docker.io/hexpm/elixir:1.18.4-erlang-28.0.2-debian-bookworm-20251117-slim # ARG ELIXIR_VERSION=1.18.4 ARG OTP_VERSION=28.0.2 -ARG DEBIAN_VERSION=bullseye-20250721-slim +ARG DEBIAN_VERSION=bookworm-20251117-slim -ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" -ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" +ARG BUILDER_IMAGE="docker.io/hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" +ARG RUNNER_IMAGE="docker.io/debian:${DEBIAN_VERSION}" -FROM ${BUILDER_IMAGE} as builder +FROM ${BUILDER_IMAGE} AS builder # install build dependencies -RUN apt-get update -y && apt-get install -y build-essential git \ - && apt-get clean && rm -f /var/lib/apt/lists/*_* +RUN apt-get update \ + && apt-get install -y --no-install-recommends build-essential git \ + && rm -rf /var/lib/apt/lists/* # prepare build dir WORKDIR /app # install hex + rebar -RUN mix local.hex --force && \ - mix local.rebar --force +RUN mix local.hex --force \ + && mix local.rebar --force # set build ENV ENV MIX_ENV="prod" @@ -45,18 +46,20 @@ RUN mkdir config COPY config/config.exs config/${MIX_ENV}.exs config/ RUN mix deps.compile +RUN mix assets.setup + COPY priv priv COPY lib lib +# Compile the release +RUN mix compile + 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/ @@ -65,18 +68,19 @@ RUN mix release # start a new build stage so that the final image will only contain # the compiled release and other runtime necessities -FROM ${RUNNER_IMAGE} +FROM ${RUNNER_IMAGE} AS final -RUN apt-get update -y && \ - apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates \ - && apt-get clean && rm -f /var/lib/apt/lists/*_* +RUN apt-get update \ + && apt-get install -y --no-install-recommends libstdc++6 openssl libncurses5 locales ca-certificates \ + && rm -rf /var/lib/apt/lists/* # Set the locale -RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen +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 +ENV LANG=en_US.UTF-8 +ENV LANGUAGE=en_US:en +ENV LC_ALL=en_US.UTF-8 WORKDIR "/app" RUN chown nobody /app diff --git a/lib/bodhi/release.ex b/lib/bodhi/release.ex index a3d010c..a1582f7 100644 --- a/lib/bodhi/release.ex +++ b/lib/bodhi/release.ex @@ -23,6 +23,8 @@ defmodule Bodhi.Release do end defp load_app do - Application.load(@app) + # Many platforms require SSL when connecting to the database + Application.ensure_all_started(:ssl) + Application.ensure_loaded(@app) end end