2026-08-18 06:50:50 +08:00
|
|
|
|
# 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 \
|
2026-08-18 09:05:23 +08:00
|
|
|
|
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
|
2026-08-18 06:50:50 +08:00
|
|
|
|
|
|
|
|
|
|
CMD ["python", "docker_entry.py"]
|