# ============================================================ # API Dockerfile - FastAPI 应用 # 优化:从预构建基础镜像开始,仅叠加业务代码 # 基础镜像包含所有系统依赖和 Python 依赖,构建时间 < 5 分钟 # ============================================================ FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/saas-api-base:latest # 构建参数:版本号(CI 传入 commit hash) ARG APP_VERSION=dev # 设置工作目录 WORKDIR /app # 复制应用代码(按变化频率从低到高排序,最大化层缓存命中) COPY alembic.ini ./alembic.ini COPY migrations/ ./migrations/ COPY alembic/ ./alembic/ COPY scripts/ ./scripts/ COPY packages/ ./packages/ COPY apps/api/ ./apps/api/ # 抖音 cookies 文件:镜像内 baked-in 兜底 + host 挂载可覆盖 # - /app/configs/douyin_cookies_default.txt: 镜像构建时 COPY 的兜底 cookies(始终有效) # - /app/configs/douyin_cookies.txt: host volume 挂载点(部署脚本 scp 覆盖,过期需更新) RUN mkdir -p /app/configs COPY deploy/configs/douyin_cookies.txt /app/configs/douyin_cookies_default.txt # 初始 COPY 一份到挂载点,host 挂载为空文件时 Python 代码会自动 fallback 到 default COPY deploy/configs/douyin_cookies.txt /app/configs/douyin_cookies.txt # 强制升级 yt-dlp 到最新(抖音反爬经常变更,旧版 cookies 支持失效;#1968/#1963) RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com --upgrade "yt-dlp>=2026.8.19" # 设置环境变量 ENV PATH="/opt/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ENV PYTHONPATH=/app:/app/apps/api ENV PYTHONUNBUFFERED=1 ENV APP_VERSION=$APP_VERSION # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health', timeout=5)" # API 入口点 CMD ["uvicorn", "apps.api.main:app", "--host", "0.0.0.0", "--port", "8000"]