70 lines
3.1 KiB
Docker
70 lines
3.1 KiB
Docker
# ============================================================
|
||
# 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"]
|