Files
xiaoxia-saas/infra/docker/api.Dockerfile
T
xiaoxia 7c0b9b3aaf
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 40s
CI/CD Pipeline / PR Build API Image (pull_request) Failing after 47s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m40s
AI Code Review / AI Code Review (pull_request) Successful in 1m59s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m0s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m30s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m31s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m36s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m32s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 10m46s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 5m22s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 12m53s
CI/CD Pipeline / CI Gate (pull_request) Failing after 46s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 696h21m56s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 696h21m56s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 696h21m57s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 696h21m59s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 696h22m0s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 696h34m53s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 696h35m31s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 696h35m31s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 696h34m54s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 696h35m35s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 696h35m35s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 696h35m32s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 696h35m33s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 696h55m40s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 697h8m36s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 697h9m16s
perf: 删除 psycopg2-binary 依赖 + 预构建 API 基础镜像
子任务 2.1 - 删除重复 PostgreSQL 驱动:
- health.py: psycopg2 → psycopg (psycopg3 迁移,3处修改)
- requirements-base.txt: 删除 psycopg2-binary==2.9.9
- 项目已全面使用 psycopg3,仅 health.py 遗留 psycopg2

子任务 2.2 - 预构建 API 基础镜像:
- 新增 infra/docker/api-base.Dockerfile (系统依赖+Python依赖预装)
- 简化 infra/docker/api.Dockerfile (从基础镜像开始,仅叠加业务代码)
- 新增 .gitea/workflows/api-base-image.yml (自动构建基础镜像)
- 新增 scripts/ci/rebuild-api-base-image.sh (手动重建脚本)

预期效果:
- API Image 构建时间从 15-20 分钟降至 3-5 分钟
- 消除 psycopg2 和 psycopg3 重复安装(减少包体积)
2026-08-18 14:50:35 +08:00

35 lines
1.2 KiB
Docker
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# 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/
# 设置环境变量
ENV PATH="/opt/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ENV PYTHONPATH=/app
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"]