FROM ghcr.io/astral-sh/uv:0.10.4 AS uvbin # --- MARK: Builder Stage FROM debian:bookworm-slim AS builder-cpu ENV DEBIAN_FRONTEND=noninteractive ENV PYTHONUNBUFFERED=1 WORKDIR /app RUN apt-get update && \ apt-get install -y --no-install-recommends \ build-essential \ python3-dev && \ rm -rf /var/lib/apt/lists/* # Install UV and set up the environment COPY --from=uvbin /uv /uvx /bin/ ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_NO_DEV=1 ENV UV_PYTHON_PREFERENCE=only-managed ENV UV_PYTHON_INSTALL_DIR=/python RUN uv python install 3.12 # Install dependencies first to leverage caching ARG EXTRAS=cpu COPY pyproject.toml uv.lock /app/ RUN set -eux; \ set --; \ for extra in $(echo "${EXTRAS:-}" | tr ',' ' '); do \ set -- "$@" --extra "$extra"; \ done; \ uv sync --frozen --no-install-project --no-editable --no-cache "$@" # Copy the source code and install the package only COPY whisperlivekit /app/whisperlivekit RUN set -eux; \ set --; \ for extra in $(echo "${EXTRAS:-}" | tr ',' ' '); do \ set -- "$@" --extra "$extra"; \ done; \ uv sync --frozen --no-editable --no-cache "$@" # --- MARK: Runtime Stage FROM debian:bookworm-slim ENV DEBIAN_FRONTEND=noninteractive WORKDIR /app RUN apt-get update && \ apt-get install -y --no-install-recommends \ ffmpeg &&\ rm -rf /var/lib/apt/lists/* # Copy UV binaries COPY --from=uvbin /uv /uvx /bin/ # Copy the Python version COPY --from=builder-cpu --chown=python:python /python /python # Copy the virtual environment with all dependencies installed COPY --from=builder-cpu /app/.venv /app/.venv EXPOSE 8000 ENV PATH="/app/.venv/bin:$PATH" ENV UV_PYTHON_DOWNLOADS=0 HEALTHCHECK --interval=30s --timeout=5s --start-period=120s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/')" || exit 1 ENTRYPOINT ["whisperlivekit-server", "--host", "0.0.0.0"] # Default args - you might want to use a smaller model for CPU CMD ["--model", "tiny"]