treefmt / nix fmt (pull_request) Successful in 5s
pytest / pytest (pull_request) Successful in 26s
build_systems / build-brain (pull_request) Successful in 45s
build_systems / build-bob (pull_request) Successful in 45s
build_systems / build-rhapsody-in-green (pull_request) Successful in 57s
build_systems / build-jeeves (pull_request) Successful in 2m17s
test ebook search / test-ebook-search (pull_request) Failing after 4s
55 lines
1.3 KiB
Docker
55 lines
1.3 KiB
Docker
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}\""]
|