42 lines
1.5 KiB
Docker
42 lines
1.5 KiB
Docker
|
|
# syntax=docker/dockerfile:1.7
|
||
|
|
FROM python:3.13-slim
|
||
|
|
|
||
|
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||
|
|
PYTHONUNBUFFERED=1 \
|
||
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
||
|
|
PIP_NO_CACHE_DIR=1 \
|
||
|
|
HOME=/data \
|
||
|
|
MEMPALACE_PALACE_PATH=/data/palace
|
||
|
|
|
||
|
|
# libgomp1: required at runtime by onnxruntime (used by chromadb's default
|
||
|
|
# embedding function — all-MiniLM-L6-v2 ONNX).
|
||
|
|
RUN apt-get update \
|
||
|
|
&& apt-get install -y --no-install-recommends ca-certificates libgomp1 \
|
||
|
|
&& rm -rf /var/lib/apt/lists/*
|
||
|
|
|
||
|
|
# Unraid convention: appdata is owned by nobody:users (99:100). Run as that
|
||
|
|
# UID/GID so files written to /data inherit the right ownership on the host.
|
||
|
|
RUN groupadd -g 100 users \
|
||
|
|
&& useradd -u 99 -g 100 -m -d /data -s /usr/sbin/nologin mempalace
|
||
|
|
|
||
|
|
WORKDIR /build
|
||
|
|
COPY pyproject.toml README.md ./
|
||
|
|
COPY mempalace ./mempalace
|
||
|
|
RUN pip install --no-cache-dir . mcp-proxy \
|
||
|
|
&& rm -rf /build
|
||
|
|
|
||
|
|
WORKDIR /data
|
||
|
|
RUN chown -R 99:100 /data
|
||
|
|
USER 99:100
|
||
|
|
|
||
|
|
# 8765 — MCP over SSE (mcp-proxy)
|
||
|
|
# 8766 — HTTP ingest (in-process thread, started when MEMPALACE_INGEST_PORT set)
|
||
|
|
EXPOSE 8765 8766
|
||
|
|
|
||
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
|
||
|
|
CMD python -c "import socket,sys;s=socket.socket();s.settimeout(2);sys.exit(0 if s.connect_ex(('127.0.0.1',8765))==0 else 1)"
|
||
|
|
|
||
|
|
# mcp-proxy wraps the stdio MCP server and exposes it as SSE on :8765.
|
||
|
|
# --pass-environment forwards MEMPALACE_* vars to the spawned child.
|
||
|
|
CMD ["mcp-proxy","--sse-host","0.0.0.0","--sse-port","8765","--pass-environment","--","mempalace-mcp"]
|