diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index b03108e16..7064c6885 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -49,6 +49,7 @@ Sander Santema
Thomas Brownback
Andrew Gaul
kenden
+Emil Hamrin
Nickolay Yudin
neitrinoweb
Andreas Reis
diff --git a/docs/docker/Dockerfile b/docs/docker/Dockerfile
index 6682f70f6..381d27d1c 100644
--- a/docs/docker/Dockerfile
+++ b/docs/docker/Dockerfile
@@ -1,35 +1,78 @@
-# This Dockerfile uses three stages.
-# 1. Compile anki (and dependencies) and build python wheels.
-# 2. Create a virtual environment containing anki and its dependencies.
-# 3. Create a final image that only includes anki's virtual environment and required
-# system packages.
+# This is a user-contributed Dockerfile. No official support is available.
-ARG PYTHON_VERSION="3.9"
ARG DEBIAN_FRONTEND="noninteractive"
-# Build anki.
-FROM python:$PYTHON_VERSION AS build
-RUN curl -fsSL https://github.com/bazelbuild/bazelisk/releases/download/v1.7.4/bazelisk-linux-amd64 \
- > /usr/local/bin/bazel \
- && chmod +x /usr/local/bin/bazel \
- # Bazel expects /usr/bin/python
- && ln -s /usr/local/bin/python /usr/bin/python
+FROM ubuntu:24.04 AS build
WORKDIR /opt/anki
-COPY . .
-# Build python wheels.
+ENV PYTHON_VERSION="3.13"
+
+
+# System deps
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ curl \
+ git \
+ build-essential \
+ pkg-config \
+ libssl-dev \
+ libbz2-dev \
+ libreadline-dev \
+ libsqlite3-dev \
+ libffi-dev \
+ zlib1g-dev \
+ liblzma-dev \
+ ca-certificates \
+ ninja-build \
+ rsync \
+ libglib2.0-0 \
+ libgl1 \
+ libx11-6 \
+ libxext6 \
+ libxrender1 \
+ libxkbcommon0 \
+ libxkbcommon-x11-0 \
+ libxcb1 \
+ libxcb-render0 \
+ libxcb-shm0 \
+ libxcb-icccm4 \
+ libxcb-image0 \
+ libxcb-keysyms1 \
+ libxcb-randr0 \
+ libxcb-shape0 \
+ libxcb-xfixes0 \
+ libxcb-xinerama0 \
+ libxcb-xinput0 \
+ libsm6 \
+ libice6 \
+ && rm -rf /var/lib/apt/lists/*
+
+# install rust with rustup
+RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
+ENV PATH="/root/.cargo/bin:${PATH}"
+
+# Install uv and Python 3.13 with uv
+RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
+ && ln -s /root/.local/bin/uv /usr/local/bin/uv
+ENV PATH="/root/.local/bin:${PATH}"
+
+RUN uv python install ${PYTHON_VERSION} --default
+
+COPY . .
+
RUN ./tools/build
+
# Install pre-compiled Anki.
-FROM python:${PYTHON_VERSION}-slim as installer
+FROM python:3.13-slim AS installer
WORKDIR /opt/anki/
-COPY --from=build /opt/anki/wheels/ wheels/
+COPY --from=build /opt/anki/out/wheels/ wheels/
# Use virtual environment.
RUN python -m venv venv \
&& ./venv/bin/python -m pip install --no-cache-dir setuptools wheel \
&& ./venv/bin/python -m pip install --no-cache-dir /opt/anki/wheels/*.whl
+
# We use another build stage here so we don't include the wheels in the final image.
-FROM python:${PYTHON_VERSION}-slim as final
+FROM python:3.13-slim AS final
COPY --from=installer /opt/anki/venv /opt/anki/venv
ENV PATH=/opt/anki/venv/bin:$PATH
# Install run-time dependencies.
@@ -59,9 +102,9 @@ RUN apt-get update \
libxrender1 \
libxtst6 \
&& rm -rf /var/lib/apt/lists/*
+
# Add non-root user.
RUN useradd --create-home anki
USER anki
WORKDIR /work
-ENTRYPOINT ["/opt/anki/venv/bin/anki"]
-LABEL maintainer="Jakub Kaczmarzyk "
+ENTRYPOINT ["/opt/anki/venv/bin/anki"]
\ No newline at end of file