Files
server-core/Dockerfile
T

70 lines
3.1 KiB
Docker
Raw Normal View History

# ============================================================
# opc-server —— 云超服核心服务端镜像
# 入口:dispatcher:app(统一入口,:8090,对外)
# 构建(在 server-core 目录内执行):
# docker build -t opc-server:latest .
#
# 依赖源全部走国内镜像(实测可用):
# 基础镜像 docker.m.daocloud.ioDocker Hub 加速)
# uv 本体 ghcr.nju.edu.cnGitHub 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:appserverrun 旧 start.sh 启动脚本已废弃移除)
# PORT 允许运行时覆盖(serverrun/docker-compose.yml 已显式固定 8090
CMD ["uv", "run", "uvicorn", "dispatcher:app", "--host", "0.0.0.0", "--port", "8090"]