build: base the image on Alpine to drop 387 MB of graphics stack
Build and publish container / build (pull_request) Canceled after 4m29s

Debian's ffmpeg package depends on libavdevice, which can capture from and
render to X11, Wayland, SDL and OpenGL. That pulls in Mesa, and Mesa pulls in
LLVM for its software rasteriser -- 127 MB of it -- plus Z3 at 27 MB and a
speech synthesiser at 28 MB, in an image whose only job is to encode MP3s on a
headless NAS.

Alpine's ffmpeg brings none of that. The runtime image goes from 576 MB to
189 MB. Small X11 and Wayland client libraries remain, but they are kilobytes
rather than megabytes.

The test suite passes unchanged inside the new image, which is the point of
running it there: the encoder under test is now a musl build from a different
distribution, and the tests cover exactly the tag, cover art and container
behaviour that could have differed. Verified separately that a CBR 256 encode
comes out at the expected bitrate with non-ASCII tags intact.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Emma Thorpe
2026-08-21 15:21:12 +01:00
co-authored by Claude Opus 5
parent cbcbf30228
commit 81dce801ce
+7 -4
View File
@@ -1,11 +1,14 @@
FROM python:3.13-slim AS runtime
# Alpine rather than Debian slim purely because of ffmpeg's dependencies.
# Debian's ffmpeg depends on libavdevice, which can render to X11, Wayland and
# OpenGL, so it drags in Mesa and with it LLVM (127 MB) and Z3 (27 MB) to
# encode an MP3 on a headless NAS. Alpine's build brings none of that: 576 MB
# down to 189 MB.
FROM python:3.13-alpine AS runtime
ENV PYTHONUNBUFFERED=1
# ffmpeg does the encoding; the application itself has no Python dependencies.
RUN apt-get update \
&& apt-get install --no-install-recommends -y ffmpeg \
&& rm -rf /var/lib/apt/lists/*
RUN apk add --no-cache ffmpeg
WORKDIR /app
COPY pyproject.toml README.md ./