FROM python:3.14-slim AS base COPY --from=ghcr.io/astral-sh/uv:0.11.26 /uv /uvx /bin/ ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ APP_DIR=/home/richie/dotfiles \ UV_PROJECT_ENVIRONMENT=/opt/venv \ UV_PYTHON_DOWNLOADS=never \ UV_NO_CACHE=1 # Separate ENV instruction so ${APP_DIR} and ${PATH} from above resolve. ENV PYTHONPATH=${APP_DIR} \ PATH=/opt/venv/bin:${PATH} WORKDIR ${APP_DIR} RUN apt-get update \ && apt-get install -y --no-install-recommends build-essential curl \ && rm -rf /var/lib/apt/lists/* COPY python/ebook_search/docker/pyproject.toml python/ebook_search/docker/uv.lock ./ RUN uv sync --locked --no-dev FROM base AS test RUN uv sync --locked COPY python ./python COPY tests/__init__.py ./tests/__init__.py COPY tests/ebook_search ./tests/ebook_search CMD ["pytest"] FROM base AS runtime ENV EBOOK_SEARCH_HOST=0.0.0.0 \ EBOOK_SEARCH_PORT=8070 \ EBOOK_SEARCH_BM25_INDEX_DIR=/data/bm25 COPY python ./python RUN useradd --create-home --uid 10001 app \ && mkdir -p /data \ && chown -R app:app /home/richie /data USER app EXPOSE 8070 CMD ["sh", "-c", "exec python -m python.ebook_search.api.main --host \"${EBOOK_SEARCH_HOST}\" --port \"${EBOOK_SEARCH_PORT}\" --log-level \"${EBOOK_SEARCH_LOG_LEVEL:-INFO}\""]