55 lines
2.0 KiB
Docker
55 lines
2.0 KiB
Docker
# ============================================================
|
||
# opc-server —— 云超服核心服务端镜像
|
||
# 入口:dispatcher:app(统一入口,:8090,对外)
|
||
# 构建(在 server-core 目录内执行):
|
||
# docker build -t opc-server:latest .
|
||
# ============================================================
|
||
FROM python:3.12-slim
|
||
|
||
# ---- 系统依赖(asyncmy/pymysql 编译 + 健康检查 curl) ----
|
||
RUN 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 ----
|
||
COPY --from=ghcr.io/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
|
||
|
||
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
|
||
|
||
# 复用项目内启动脚本:初始化 serverdata 目录 → exec uv run uvicorn dispatcher:app
|
||
CMD ["bash", "serverrun/start.sh"]
|