Files
noteflow/docker/server.Dockerfile

89 lines
2.5 KiB
Docker

# syntax=docker/dockerfile:1
ARG PYTHON_VERSION=3.12
ARG SPACY_MODEL_URL=https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl
FROM python:${PYTHON_VERSION}-slim-bookworm AS base
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
UV_COMPILE_BYTECODE=1 \
UV_LINK_MODE=copy
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libportaudio2 \
libsndfile1 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
COPY pyproject.toml uv.lock* ./
# =============================================================================
# Production Server Stage (minimal deps, no dev tooling)
# =============================================================================
FROM base AS build
ARG SPACY_MODEL_URL
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
pkg-config \
portaudio19-dev \
&& rm -rf /var/lib/apt/lists/*
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-install-project --no-dev
COPY . .
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-dev
RUN --mount=type=cache,target=/root/.cache/uv \
uv pip install "${SPACY_MODEL_URL}"
FROM base AS server
COPY --from=build /workspace /workspace
RUN useradd --create-home --shell /bin/bash noteflow
USER noteflow
EXPOSE 50051
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD python -c "import grpc; channel = grpc.insecure_channel('localhost:50051'); grpc.channel_ready_future(channel).result(timeout=5)" || exit 1
CMD ["uv", "run", "python", "-m", "noteflow.grpc.server"]
# =============================================================================
# Development Server Stage (all extras + dev deps + hot reload)
# =============================================================================
FROM base AS dev
ARG SPACY_MODEL_URL
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
pkg-config \
portaudio19-dev \
&& rm -rf /var/lib/apt/lists/*
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-install-project --group dev --all-extras
COPY . .
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --group dev --all-extras
RUN --mount=type=cache,target=/root/.cache/uv \
uv pip install "${SPACY_MODEL_URL}"
EXPOSE 50051
CMD ["uv", "run", "python", "scripts/dev_watch_server.py"]