2026-09-08 21:11:12 +08:00
# ============================================================
# opc-server —— 云超服核心服务端镜像
# 入口:dispatcher:app(统一入口,:8090,对外)
# 构建(在 server-core 目录内执行):
# docker build -t opc-server:latest .
2026-09-08 21:30:45 +08:00
#
# 依赖源全部走国内镜像(实测可用):
# 基础镜像 docker.m.daocloud.io( Docker Hub 加速)
# uv 本体 ghcr.nju.edu.cn( GitHub Container 加速)
# apt mirrors.tuna.tsinghua.edu.cn(清华)
# PyPI mirrors.aliyun.com/pypi/simple(阿里云)
2026-09-08 21:11:12 +08:00
# ============================================================
2026-09-08 21:30:45 +08:00
FROM docker.m.daocloud.io/library/python:3.12-slim
2026-09-08 21:11:12 +08:00
2026-09-08 21:30:45 +08:00
# ---- 系统依赖(asyncmy/pymysql 编译 + 健康检查 curl);apt 源先切清华镜像 ----
RUN set -eux; \
if [ -f /etc/apt/sources.list.d/debian.sources ] ; then \
sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g; s|http://security.debian.org/debian-security|https://mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list.d/debian.sources; \
fi ; \
if [ -f /etc/apt/sources.list ] ; then \
sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g; s|http://security.debian.org/debian-security|https://mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list; \
fi ; \
apt-get update && apt-get install -y --no-install-recommends \
2026-09-08 21:11:12 +08:00
curl \
git \
build-essential \
pkg-config \
default-libmysqlclient-dev \
libffi-dev \
&& rm -rf /var/lib/apt/lists/*
2026-09-08 21:30:45 +08:00
# ---- 安装 uv(南大 ghcr 镜像加速) ----
COPY --from= ghcr.nju.edu.cn/astral-sh/uv:0.5 /uv /usr/local/bin/uv
2026-09-08 21:11:12 +08:00
ENV UV_LINK_MODE = copy \
UV_COMPILE_BYTECODE = 1 \
UV_PYTHON_DOWNLOADS = never \
PYTHONDONTWRITEBYTECODE = 1 \
PYTHONUNBUFFERED = 1 \
2026-09-08 21:30:45 +08:00
PIP_NO_CACHE_DIR = 1 \
UV_DEFAULT_INDEX = https://mirrors.aliyun.com/pypi/simple/
2026-09-08 21:11:12 +08:00
WORKDIR /app
# ============================================================
# 依赖层(先装依赖,利用 Docker 层缓存;项目本体待代码层构建)
# ============================================================
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev --no-install-project
# ============================================================
# 代码层(.dockerignore 已排除 .venv/.env/serverdata 运行时数据/wechatpayv3 密钥等)
# ============================================================
COPY . .
RUN uv sync --frozen --no-dev
# 数据目录(运行时卷挂载;seed/、prompts/ 模板随镜像提供)
RUN mkdir -p serverdata/data serverdata/logs serverdata/files \
serverdata/keys serverdata/prompts serverdata/uploads \
serverdata/park serverdata/backup
EXPOSE 8090
HEALTHCHECK --interval= 30s --timeout= 5s --start-period= 30s --retries= 3 \
CMD curl -fsS http://127.0.0.1:8090/health || exit 1
2026-09-08 21:30:45 +08:00
# 入口:直接启动 dispatcher:app( serverrun 旧 start.sh 启动脚本已废弃移除)
# PORT 允许运行时覆盖(serverrun/docker-compose.yml 已显式固定 8090)
CMD [ "uv" , "run" , "uvicorn" , "dispatcher:app" , "--host" , "0.0.0.0" , "--port" , "8090" ]