# ============================================================ # 明缘云道场 · FastAPI 后端 Docker 镜像 # # 基础镜像用 Python 3.11(3.9 已 EOL,3.11 是当前主流 LTS)。 # ⚠️ requirements.txt 全是「>=」下限约束:3.11 会解析到**最新版** fastapi/uvicorn/pydantic, # 与线上 3.9(pyenv39)装的旧版(fastapi 0.128.x / uvicorn 0.39.x)不同 —— # 切换前需用 3.11 重新做一遍接口验证(见部署方案 §3.1)。 # ============================================================ FROM python:3.11-slim # 时区:业务用 date.today() 算「上课日/周期边界」,必须是 Asia/Shanghai。 # 项目本身无 TZ 配置,全靠系统时区,容器默认 UTC 会把周期窗口整体错位。 ENV TZ=Asia/Shanghai \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # 换国内 apt 镜像源:构建机访问 deb.debian.org 很慢(apt-get update 要拉 ~10MB+ 索引, # 官方源可能 4~5 分钟)。换成清华源后首次构建可降到几十秒。 # 同时兼容 deb822(debian.sources)与旧版 sources.list;构建机在海外可删掉换源这段。 RUN set -eux; \ for f in /etc/apt/sources.list.d/debian.sources /etc/apt/sources.list; do \ [ -f "$f" ] && sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' "$f"; \ done; \ apt-get update \ && apt-get install -y --no-install-recommends tzdata curl \ && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ && echo ${TZ} > /etc/timezone \ && rm -rf /var/lib/apt/lists/* WORKDIR /srv # 先装依赖,利用构建缓存:requirements.txt 没变就不会重装。 # crcmod(oss2 的依赖)是 C 扩展 sdist,镜像里没装编译器,它会自动退回 # 纯 Python 实现 —— 属预期行为,只是 CRC 校验慢一点,不影响功能。 COPY requirements.txt /srv/requirements.txt # pip 同样走国内镜像:构建机访问 pypi.org 也慢(本轮实测 10~22 kB/s), # 换清华 PyPI 后这步可从 4 分钟降到几十秒。若清华缺包,可换成 # https://mirrors.aliyun.com/pypi/simple/ RUN pip install -r /srv/requirements.txt \ -i https://pypi.tuna.tsinghua.edu.cn/simple # 代码放 /srv/wechat_backend/ —— main.py 已用相对导入(from . import ...), # 包名与目录名彻底解耦,这里叫什么都能正常启动(uvicorn wechat_backend.main:app)。 COPY . /srv/wechat_backend/ # 端口由 PORT 环境变量决定(测试 8000 / 生产 8001) EXPOSE 8000 8001 # 健康检查走应用自带 /api/v1/health(无鉴权、无 DB 依赖,只证进程存活) # curl -f:非 2xx 直接返回非零退出码;${PORT:-8000} 由容器内 shell 展开 HEALTHCHECK --interval=30s --timeout=3s --start-period=15s --retries=3 \ CMD curl -fsS "http://127.0.0.1:${PORT:-8000}/api/v1/health" >/dev/null || exit 1 # exec 让 uvicorn 成为 PID 1,能接收 SIGTERM 优雅退出。 # --workers 默认 1(贴近现状);状态全在 DB/OSS、无内存态,多进程安全,需要时可调大。 CMD ["sh", "-c", "exec uvicorn wechat_backend.main:app --host 0.0.0.0 --port ${PORT:-8000} --workers ${WORKERS:-1}"]