# crop-chem-docs MCP server — production image. # # Structure: copy code first, then the regenerable indexes last so a # code-only change doesn't invalidate the corpus COPY layer. # # The container runs the MCP server via streamable-http on PORT 8000. # Override via MCP_HOST / MCP_PORT env if you front it with a different # reverse-proxy setup. # # Image is self-contained — corpus, Chroma collection, and BM25 db are # all baked in. Drawbar's docker-compose pulls the image and runs it; # no host volume mounts required for serve. # # RERANK_URL is set at compose time (points at the llama.cpp sidecar # on trashpanda's Tesla P4). OLLAMA_URL is set at compose time too # (the embed-pool of Ollama instances). Defaults are commented inline. FROM python:3.12-slim WORKDIR /app # Install Python deps first for cacheability. COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Code. COPY scrape /app/scrape COPY rag /app/rag COPY docs_mcp /app/docs_mcp # Source catalog. Lists the corpus sources (Bayer + EPA PPLS today). COPY sources.json /app/ # Regenerable indexes. CI builds these from corpus/ in the same job # that builds the image. Listed last so code changes don't invalidate # the COPY layer cache for these (much larger) directories. # # bm25/ is only consulted when HYBRID_SEARCH=true (the server falls # back to dense-only if it's missing). COPY corpus /app/corpus COPY chroma /app/chroma COPY bm25 /app/bm25 ENV PYTHONUNBUFFERED=1 \ PRODUCT_NAME=crop_chem \ MCP_TRANSPORT=streamable-http \ MCP_HOST=0.0.0.0 \ MCP_PORT=8000 \ HYBRID_SEARCH=true \ OLLAMA_URL=http://ollama:11434 \ RERANK_URL=http://llama-rerank:8080 # Defaults above assume the MCP container shares a Docker network # with services named `ollama` and `llama-rerank`. Override either # in the compose `environment:` block if your stack uses different # service names or if you want to point at off-stack hosts. EXPOSE 8000 ENTRYPOINT ["python", "-m", "docs_mcp.server"]