Archived
- web/main.py:uvicorn 入口,默认开启 Flask 兜底(未迁移路由回落遗留应用); HOST/PORT/LOG_LEVEL 环境变量可配;proxy_headers 按 XFF 取真实 IP(仅信回环); server_header=False 抹服务器指纹 - entrypoint.sh:默认 exec web/main.py;WEB_STACK=flask 可应急回退旧入口 - Dockerfile:安装 requirements-fastapi.txt(目标栈)+ requirements.txt(Flask 兜底) 验证(单进程双框架实跑):/health、/(Flask 兜底)与 /api/v1/site/stats(FastAPI) 均 200;Server 头为 NeteaseUrl;ruff/pyright 干净。
27 lines
1.4 KiB
Docker
27 lines
1.4 KiB
Docker
# T7:基础镜像升级到 Python 3.12(3.9 已于 2025-10 EOL);alpine + ffmpeg 组合保持不变
|
||
FROM python:3.12-alpine3.21
|
||
WORKDIR /app
|
||
# 使用阿里云 apk 镜像源加速安装 ffmpeg
|
||
# 第 97 条(P3):补 tzdata——alpine 无 zoneinfo,ENV TZ=Asia/Shanghai 不装它不生效
|
||
# (容器内日志/展示本地时间差 8 小时;计费/会话全部 epoch 秒不受影响)
|
||
RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories && \
|
||
apk add --no-cache tzdata ffmpeg
|
||
# 目标栈:FastAPI + uvicorn(Flask 作为迁移期兜底仍随包)
|
||
COPY requirements-fastapi.txt requirements-fastapi.txt
|
||
COPY requirements.txt requirements.txt
|
||
RUN pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
|
||
pip3 install --no-cache-dir -r requirements-fastapi.txt && \
|
||
pip3 install --no-cache-dir -r requirements.txt
|
||
COPY . .
|
||
RUN chmod +x /app/entrypoint.sh
|
||
# 非 root 运行(容器安全基线)。注:挂载卷 ./downloads ./data 的宿主机目录
|
||
# 需对 UID 10001 可写(见 docker-compose.yml 注释),否则下载与数据库写入会失败
|
||
RUN adduser -D -u 10001 appuser && chown -R appuser:appuser /app
|
||
USER appuser
|
||
ENV TZ=Asia/Shanghai
|
||
EXPOSE 5000
|
||
# 容器健康检查(/health 为轻量本地端点,不触发上游请求)
|
||
HEALTHCHECK --interval=60s --timeout=5s --start-period=20s --retries=3 \
|
||
CMD wget -qO- http://127.0.0.1:5000/health || exit 1
|
||
CMD ["/app/entrypoint.sh"]
|