# syntax=docker/dockerfile:1 # ============================================================ # OPC 智能园区后端(FastAPI + s2s 语音栈)Docker 镜像 # 构建: docker build -f backend/Dockerfile -t dpm-backend . # 运行: docker compose up -d --build (推荐,见根目录 docker-compose.yml) # 说明: # · 依赖使用 uv 按 uv.lock 锁定安装(Python 3.12) # · vendor/s2s-cloud(补丁版语音栈)以 --no-deps 方式安装,避免拖入多余依赖 # · silero VAD / nltk 数据 / YOLO 模型随镜像打包,运行期不联网下载 # · media / knowledge / data.json 挂载为持久卷(数据与知识库可热更新) # ============================================================ FROM python:3.12-slim-bookworm ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ UV_LINK_MODE=copy \ UV_PROJECT_ENVIRONMENT=/opt/venv \ PATH="/opt/venv/bin:$PATH" # 系统依赖:libsndfile1(soundfile 音频解码)、libgomp1(torch)、 # libgl1/libglib2.0-0(OpenCV/ultralytics 图像处理) RUN apt-get update && apt-get install -y --no-install-recommends \ libsndfile1 \ libgomp1 \ libgl1 \ libglib2.0-0 \ curl \ && rm -rf /var/lib/apt/lists/* # uv 包管理器(按 lock 锁定版本安装) COPY --from=ghcr.io/astral-sh/uv:0.7.4 /uv /uvx /usr/local/bin/ WORKDIR /app COPY backend /app/backend WORKDIR /app/backend # 1) 按 uv.lock 安装全部依赖(不含 dev;不安装项目本身,保持 /app/backend 为源码目录) RUN uv sync --locked --no-dev --no-install-project # 2) 安装补丁后的 s2s 语音栈(--no-deps:仅装包体,依赖已由 uv sync 覆盖) RUN uv pip install --no-deps --no-build-isolation -e vendor/s2s-cloud # 3) 运行期资源目录(本地缓存随镜像打包,避免运行期联网下载) ENV TORCH_HOME=/app/backend/.torch-cache \ NLTK_DATA=/app/backend/nltk_data \ YOLO_CONFIG_DIR=/app/backend/.ultralytics \ NO_PROXY=* \ no_proxy=* # 持久卷:媒体资源 / 知识库 / 运行数据 VOLUME ["/app/backend/media", "/app/backend/knowledge", "/app/backend/data.json"] EXPOSE 10085 8765 HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=5 \ CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://192.168.1.9:10085/api/health', timeout=4).status==200 else 1)" || exit 1 CMD ["python", "docker_entry.py"]