Files

61 lines
2.4 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"
# 系统依赖:libsndfile1soundfile 音频解码)、libgomp1torch)、
# libgl1/libglib2.0-0OpenCV/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"]