61 lines
2.4 KiB
Docker
61 lines
2.4 KiB
Docker
# 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"]
|