perf(ci): Dockerfile优化 - cache mount加速 + API多阶段瘦身 #679

Merged
auto-approve-bot merged 1 commits from opt/dockerfile-cache-mount into develop 2026-07-21 14:00:29 +08:00
Owner

优化内容

API Dockerfile

  • 多阶段构建:拆分为builder + runtime两阶段,gcc/libpq-dev等编译依赖留在builder阶段
  • runtime瘦身:只装libpq5运行时库,去掉编译工具链
  • pip cache mount:所有pip install加上--mount=type=cache,target=/root/.cache/pip
  • .so strip + pyc清理:进一步减小镜像体积

Worker Dockerfile

  • pip cache mount:3处pip install全部加上cache mount
  • ffmpeg cache mount:静态编译包下载缓存,避免每次重新下载几十MB
  • 原有的多阶段+瘦身逻辑保持不变

预期收益

  • 冷启动:变化不大(第一次cache是空的)
  • 热构建:依赖下载时间显著减少(pip包/ffmpeg都从缓存读)
  • API镜像体积:减小约100-200MB(去掉编译工具链)

验证

等待CI跑完,对比3个Docker build耗时。

## 优化内容 ### API Dockerfile - **多阶段构建**:拆分为builder + runtime两阶段,gcc/libpq-dev等编译依赖留在builder阶段 - **runtime瘦身**:只装libpq5运行时库,去掉编译工具链 - **pip cache mount**:所有pip install加上`--mount=type=cache,target=/root/.cache/pip` - **.so strip + pyc清理**:进一步减小镜像体积 ### Worker Dockerfile - **pip cache mount**:3处pip install全部加上cache mount - **ffmpeg cache mount**:静态编译包下载缓存,避免每次重新下载几十MB - 原有的多阶段+瘦身逻辑保持不变 ## 预期收益 - 冷启动:变化不大(第一次cache是空的) - 热构建:依赖下载时间显著减少(pip包/ffmpeg都从缓存读) - API镜像体积:减小约100-200MB(去掉编译工具链) ## 验证 等待CI跑完,对比3个Docker build耗时。
xiaoxia added 1 commit 2026-07-21 13:48:19 +08:00
perf(ci): Dockerfile优化 - cache mount加速依赖下载 + API多阶段瘦身
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 9s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 7m2s
AI Code Review / AI Code Review (pull_request) Successful in 8m5s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 8m50s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 10m3s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 10m59s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 12m11s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 10s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 8m51s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 14m53s
dec7582f98
API Dockerfile:
- 改为多阶段构建(builder+runtime),编译依赖留在builder
- runtime只装libpq5运行时库,镜像体积减小
- 加pip cache mount,加速重复构建的依赖下载
- strip .so调试符号 + 清理pyc,进一步瘦身

Worker Dockerfile:
- 加pip cache mount(3处pip install都加)
- ffmpeg下载加cache mount,避免每次重新下载几十MB
- 原有的多阶段+瘦身逻辑保持不变

🚀 预览环境已部署

项目 详情
PR号 #679
预览链接 https://pr-679.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #679 | | 预览链接 | [https://pr-679.preview.xiaoxiajianji.com](https://pr-679.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

代码审查结果 - PR #679

⚠️ 问题(2个需要修改)

  1. infra/docker/api.Dockerfile Runtime阶段:缺少 ENV PATH="/opt/venv/bin:$PATH" 环境变量设置。

    • 原因:Builder 阶段设置的环境变量在多阶段构建中不会自动传递到 Runtime 阶段。
    • 后果:Runtime 阶段的 HEALTHCHECK(使用 python 命令)及后续启动命令将调用系统 Python 而非虚拟环境中的 Python,导致依赖库找不到或版本不一致,引发应用启动失败或健康检查误报。
  2. infra/docker/worker.Dockerfile 第28行:下载 FFmpeg 静态二进制文件时未进行完整性校验(如 SHA256)。

    • 原因:直接使用 wget 下载并解压,未验证文件哈希。
    • 后果:存在供应链攻击风险(中间人攻击替换恶意文件)或下载不完整文件导致构建失败。

💡 建议(2个可选)

  1. infra/docker/api.Dockerfile Builder阶段strip --strip-all 命令虽然能减小镜像体积,但可能导致某些 C 扩展(如 PyTorch、部分加密库)运行时崩溃。建议在测试环境充分验证,或仅对特定目录执行,避免全局 strip。
  2. infra/docker/worker.Dockerfile 第28行:建议将 FFmpeg 下载源替换为带版本号的固定 URL,并优先考虑将二进制文件存放在公司内部的对象存储或私有仓库中,避免依赖外部不稳定的第三方源。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-21 13:56:18 | 模型:

## 代码审查结果 - PR #679 ### ⚠️ 问题(2个需要修改) 1. **infra/docker/api.Dockerfile Runtime阶段**:缺少 `ENV PATH="/opt/venv/bin:$PATH"` 环境变量设置。 - **原因**:Builder 阶段设置的环境变量在多阶段构建中不会自动传递到 Runtime 阶段。 - **后果**:Runtime 阶段的 `HEALTHCHECK`(使用 `python` 命令)及后续启动命令将调用系统 Python 而非虚拟环境中的 Python,导致依赖库找不到或版本不一致,引发应用启动失败或健康检查误报。 2. **infra/docker/worker.Dockerfile 第28行**:下载 FFmpeg 静态二进制文件时未进行完整性校验(如 SHA256)。 - **原因**:直接使用 `wget` 下载并解压,未验证文件哈希。 - **后果**:存在供应链攻击风险(中间人攻击替换恶意文件)或下载不完整文件导致构建失败。 ### 💡 建议(2个可选) 1. **infra/docker/api.Dockerfile Builder阶段**:`strip --strip-all` 命令虽然能减小镜像体积,但可能导致某些 C 扩展(如 PyTorch、部分加密库)运行时崩溃。建议在测试环境充分验证,或仅对特定目录执行,避免全局 strip。 2. **infra/docker/worker.Dockerfile 第28行**:建议将 FFmpeg 下载源替换为带版本号的固定 URL,并优先考虑将二进制文件存放在公司内部的对象存储或私有仓库中,避免依赖外部不稳定的第三方源。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-21 13:56:18 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-07-21 13:59:17 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-21 13:59:17 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit faf018030f into develop 2026-07-21 14:00:29 +08:00
auto-approve-bot deleted branch opt/dockerfile-cache-mount 2026-07-21 14:00:29 +08:00

🗑️ 预览环境已清理

PR #679 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #679 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.