Files
dotfiles/python/ebook_search/docker
Richie 4799054601
treefmt / nix fmt (pull_request) Successful in 5s
pytest / pytest (pull_request) Successful in 27s
build_systems / build-brain (pull_request) Successful in 44s
build_systems / build-bob (pull_request) Successful in 47s
build_systems / build-rhapsody-in-green (pull_request) Successful in 56s
build_systems / build-jeeves (pull_request) Successful in 2m54s
test ebook search / test-ebook-search (pull_request) Failing after 19s
ci(ebook-search): run tests via uv on the runner instead of docker
The gitea runner containers have no docker access, so build the test
env with uv from the existing lockfile and run pytest directly:

- test_ebook_search workflow: uv sync --locked + uv run pytest, with
  UV_PYTHON_DOWNLOADS=never so uv uses the nix-provided python 3.14
- add uv to the runner hostPackages (needs a jeeves rebuild to apply)
- ignore nested **/.venv in .dockerignore (uv sync creates one in
  python/ebook_search/docker)
- document the uv test commands in the docker README; the docker test
  image remains for validating the image itself
2026-07-12 16:40:56 -04:00
..

Ebook Search Docker

Run the EPUB search app against the existing Postgres database on jeeves:

python -m python.ebook_search.docker.containers start --library-path /path/to/epubs --build

All ebook-search Docker files live in this directory:

  • Dockerfile — multi-stage: test (runs pytest) and runtime (default target, the app image)
  • docker-compose.yml
  • containers.py — Typer lifecycle CLI
  • pyproject.toml / uv.lock — the container's uv-locked dependencies

The app listens on http://localhost:8070.

Useful lifecycle commands:

python -m python.ebook_search.docker.containers build
python -m python.ebook_search.docker.containers start --library-path /path/to/epubs
python -m python.ebook_search.docker.containers test
python -m python.ebook_search.docker.containers logs
python -m python.ebook_search.docker.containers ps
python -m python.ebook_search.docker.containers stop

Direct compose usage from the repo root:

docker compose -f python/ebook_search/docker/docker-compose.yml ps

Dependencies

The image builds its environment with uv from pyproject.toml + uv.lock in this directory — this is the source of truth for the container's dependencies. To add or update a dependency, edit pyproject.toml here and regenerate the lock (requires uv on the host; it is not in the nix dev shell):

cd python/ebook_search/docker && uv lock

Tests

The main pytest suite excludes tests/ebook_search (its dependencies are no longer in the nix dev shell). The test ebook search CI workflow runs them in a uv env built from the lockfile in this directory — same commands work locally from the repo root (the --override-ini drops the main suite's ignore):

uv sync --locked --project python/ebook_search/docker
uv run --project python/ebook_search/docker --no-sync pytest tests/ebook_search --override-ini addopts="-n auto -ra"

They can also run inside the Docker test image, which validates the image itself:

python -m python.ebook_search.docker.containers test

or the raw docker equivalent:

docker build --file python/ebook_search/docker/Dockerfile --target test --tag ebook-search:test .
docker run --rm ebook-search:test

Configuration

The compose service loads the repo root .env into the container via env_file.

Mount your EPUB directory by setting EBOOK_LIBRARY_HOST_PATH in an env file or on the command line. The container sees it as /library, and EBOOK_SEARCH_LIBRARY_PATHS is set to /library inside the container.

Database connection settings are controlled by RICHIE_DB, RICHIE_HOST, RICHIE_PORT, RICHIE_USER, and RICHIE_PASSWORD. The default host is jeeves.