From 7685fa53d1023b257db04d270081f4963add17dd Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Sun, 25 Jan 2026 09:21:42 -0600 Subject: [PATCH] fix: use official hexpm/elixir images instead of erlang-solutions repo The Erlang Solutions APT repository was experiencing 504 Gateway Timeout errors during builds, making the image build process unreliable. Changes: - Use official hexpm/elixir Docker image as builder stage - More reliable (official Docker Hub images) - Faster builds (pre-built binaries, no package installation) - Still produces minimal runtime-only final image - Updated documentation to reflect new approach Benefits: - No dependency on erlang-solutions CDN availability - Faster build times (no apt-get install of large packages) - Same minimal final image size (~150-200 MB) - Easier to specify exact Erlang/Elixir versions --- k8s/base-image/Dockerfile | 28 ++++------------------------ k8s/base-image/README.md | 10 +++++----- 2 files changed, 9 insertions(+), 29 deletions(-) diff --git a/k8s/base-image/Dockerfile b/k8s/base-image/Dockerfile index 0628b979..4680312a 100644 --- a/k8s/base-image/Dockerfile +++ b/k8s/base-image/Dockerfile @@ -1,5 +1,5 @@ # Minimal Debian 13 (Trixie) with Erlang/OTP and Elixir runtime -# Built from scratch with only essential packages +# Uses official hexpm/elixir images as builder for reliability # # This image is designed to be rebuilt regularly to get latest security updates @@ -7,30 +7,10 @@ ARG DEBIAN_VERSION=trixie-20251229-slim ARG ERLANG_VERSION=28.3 ARG ELIXIR_VERSION=1.19.5 -FROM docker.io/debian:${DEBIAN_VERSION} as builder +# Use official Elixir image as builder (more reliable than erlang-solutions repo) +FROM docker.io/hexpm/elixir:${ELIXIR_VERSION}-erlang-${ERLANG_VERSION}-debian-${DEBIAN_VERSION} as builder -# Install build dependencies (will be removed in final image) -RUN apt-get update \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - wget \ - ca-certificates \ - gnupg2 \ - && rm -rf /var/lib/apt/lists/* - -# Add Erlang Solutions repository for latest Erlang/OTP -RUN wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | \ - gpg --dearmor -o /usr/share/keyrings/erlang-solutions.gpg \ - && echo "deb [signed-by=/usr/share/keyrings/erlang-solutions.gpg] https://packages.erlang-solutions.com/debian trixie contrib" \ - > /etc/apt/sources.list.d/erlang.list - -# Install Erlang/OTP and Elixir -RUN apt-get update \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - esl-erlang \ - elixir \ - && rm -rf /var/lib/apt/lists/* - -# Verify installations +# Verify installations in builder RUN erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell RUN elixir --version diff --git a/k8s/base-image/README.md b/k8s/base-image/README.md index dce6eaf5..d51b52db 100644 --- a/k8s/base-image/README.md +++ b/k8s/base-image/README.md @@ -42,8 +42,8 @@ chmod +x build.sh ``` This builds a multi-stage Docker image with: -- **Builder stage**: Installs Erlang and Elixir from Erlang Solutions repository -- **Final stage**: Minimal Debian with only runtime dependencies +- **Builder stage**: Uses official hexpm/elixir image with pre-built Erlang/Elixir +- **Final stage**: Minimal Debian with only runtime dependencies copied from builder ### Updating System Packages @@ -191,8 +191,8 @@ rebuild-base-image: ### Image fails to build ```bash -# Check if Erlang Solutions repository is accessible -wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc +# Check if hexpm images are accessible +docker pull hexpm/elixir:1.19.5-erlang-28.3-debian-trixie-20251229-slim # Try building with verbose output docker build --progress=plain --no-cache -f Dockerfile . @@ -237,6 +237,6 @@ We use **Debian** instead of Alpine because: ## See Also -- [Erlang Solutions Packages](https://www.erlang-solutions.com/downloads/) +- [hexpm/elixir Docker Images](https://hub.docker.com/r/hexpm/elixir) - [Elixir Installation Guide](https://elixir-lang.org/install.html) - [Docker Multi-Stage Builds](https://docs.docker.com/build/building/multi-stage/)