# ============================================================ # opc-server —— 云超服核心服务端镜像 # 入口:dispatcher:app(统一入口,:8090,对外) # 构建(在 server-core 目录内执行): # docker build -t opc-server:latest . # # 依赖源全部走国内镜像(实测可用): # 基础镜像 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(阿里云) # ============================================================ FROM docker.m.daocloud.io/library/python:3.12-slim # ---- 系统依赖(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 \ curl \ git \ build-essential \ pkg-config \ default-libmysqlclient-dev \ libffi-dev \ && rm -rf /var/lib/apt/lists/* # ---- 安装 uv(南大 ghcr 镜像加速) ---- COPY --from=ghcr.nju.edu.cn/astral-sh/uv:0.5 /uv /usr/local/bin/uv ENV UV_LINK_MODE=copy \ UV_COMPILE_BYTECODE=1 \ UV_PYTHON_DOWNLOADS=never \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ UV_DEFAULT_INDEX=https://mirrors.aliyun.com/pypi/simple/ 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 # 入口:直接启动 dispatcher:app(serverrun 旧 start.sh 启动脚本已废弃移除) # PORT 允许运行时覆盖(serverrun/docker-compose.yml 已显式固定 8090) CMD ["uv", "run", "uvicorn", "dispatcher:app", "--host", "0.0.0.0", "--port", "8090"]