# AWOOOI API - Production Dockerfile # Phase 6.4i: 支援 monorepo 本地 packages (lewooogo-brain, lewooogo-data) # # 使用方式 (從 monorepo 根目錄): # docker build -f apps/api/Dockerfile -t awoooi-api:v1.0.0 . # # 注意: 必須從 monorepo 根目錄執行,否則無法存取 packages/ FROM python:3.11-slim AS builder WORKDIR /app # Install uv (固定版本,禁止 :latest) COPY --from=ghcr.io/astral-sh/uv:0.6.9 /uv /bin/uv # Phase 6.4i: 複製本地 packages 到 Docker context # 順序重要: 先複製 packages,再複製 api (利用 Docker layer cache) COPY packages/lewooogo-data/ /packages/lewooogo-data/ COPY packages/lewooogo-brain/ /packages/lewooogo-brain/ # 複製 API 依賴文件 (pyproject.toml 需要 README.md) COPY apps/api/pyproject.toml apps/api/README.md ./ # 複製 src 目錄 (hatchling build 需要) COPY apps/api/src/ ./src/ # 安裝本地 packages 與 API 依賴 (合併 RUN 減少 layer) # 注意: `uv pip install .` 從 pyproject.toml 安裝依賴 RUN uv pip install --system --no-cache /packages/lewooogo-data && \ uv pip install --system --no-cache /packages/lewooogo-brain && \ uv pip install --system --no-cache . # Production stage FROM python:3.11-slim WORKDIR /app # Copy installed packages from builder COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/bin /usr/local/bin # 2026-04-01 ogt: CACHE_BUST 強制失效 src/ 和 models.json 層 # deps 層 (pip install) 仍可 cache;代碼/配置變更必須重建 ARG CACHE_BUST=none COPY apps/api/src/ ./src/ COPY apps/api/models.json ./models.json # Create non-root user RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app USER appuser # Expose port EXPOSE 8000 # Health check (使用正確的 API 路徑) HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD python -c "import httpx; httpx.get('http://localhost:8000/api/v1/health', timeout=5)" || exit 1 # Run application CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]