# Standalone image for services/tech-step-intent-service — hors du build # apps/api (voir services/tech-step-llm-worker/Dockerfile pour le précédent # direct : un service Python/spaCy n'a rien à faire dans l'image Node de # l'API, et inversement). Rien n'est persisté sur disque (pas de VOLUME, # contrairement au worker LLM) : tout l'état (textcat/matcher entraînés) # vit en mémoire, reconstruit à chaque `/v1/train` depuis un corpus que ce # service ne possède pas lui-même (voir intent_service/README.md). FROM python:3.12-slim AS base RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv WORKDIR /service FROM base AS build # `uv.lock` est commité pour ce service (même rigueur que # `pnpm-lock.yaml`/`--frozen-lockfile` pour apps/api et # services/tech-step-llm-worker) — `--frozen` échoue bruyamment si # `pyproject.toml` a dérivé du lock plutôt que de re-résoudre en silence. # `--no-install-project` sépare l'installation des dépendances (dont les # wheels de modèles spaCy, pinnés par URL dans pyproject.toml) de la copie # du code applicatif, pour que le cache de layer Docker survive à un # changement dans intent_service/ sans retélécharger ~80 Mo de modèles. # Chemins préfixés par `services/tech-step-intent-service/` : le contexte # de build est la racine du repo (`docker-compose.yml`'s `build.context: .`), # même convention que `services/tech-step-llm-worker/Dockerfile`. COPY services/tech-step-intent-service/pyproject.toml services/tech-step-intent-service/uv.lock ./ RUN uv sync --frozen --no-install-project --no-dev COPY services/tech-step-intent-service/intent_service ./intent_service RUN uv sync --frozen --no-dev FROM base AS runtime ENV PYTHONUNBUFFERED=1 COPY --from=build /service /service EXPOSE 8000 CMD ["uv", "run", "uvicorn", "intent_service.main:app", "--host", "0.0.0.0", "--port", "8000"]