Spaces:
Sleeping
Sleeping
feat: 更改為使用uv管理
Browse files- Dockerfile +43 -8
Dockerfile
CHANGED
|
@@ -1,13 +1,48 @@
|
|
| 1 |
-
|
|
|
|
| 2 |
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
|
| 7 |
WORKDIR /app
|
| 8 |
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
-
|
| 13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 階段 1:構建環境
|
| 2 |
+
FROM ghcr.io/astral-sh/uv:python3.14-bookworm-slim AS builder
|
| 3 |
|
| 4 |
+
# 設置 uv 緩存和編譯環境變量
|
| 5 |
+
ENV UV_COMPILE_BYTECODE=1 \
|
| 6 |
+
UV_LINK_MODE=copy
|
| 7 |
|
| 8 |
WORKDIR /app
|
| 9 |
|
| 10 |
+
# 利用 Docker 層緩存安裝依賴
|
| 11 |
+
# 這裡使用 --mount 綁定 uv.lock 和 pyproject.toml,避免額外的 COPY 動作
|
| 12 |
+
RUN --mount=type=cache,target=/root/.cache/uv \
|
| 13 |
+
--mount=type=bind,source=uv.lock,target=uv.lock \
|
| 14 |
+
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
|
| 15 |
+
uv sync --frozen --no-install-project --no-dev
|
| 16 |
|
| 17 |
+
# 階段 2:運行環境
|
| 18 |
+
FROM python:3.14-slim-bookworm
|
| 19 |
+
|
| 20 |
+
# 設置 Python 環境變量
|
| 21 |
+
# PYTHONUNBUFFERED=1: 確保日誌直接輸出而不被緩衝
|
| 22 |
+
# PYTHONDONTWRITEBYTECODE=1: 不在容器內生成 .pyc 文件
|
| 23 |
+
ENV PYTHONUNBUFFERED=1 \
|
| 24 |
+
PYTHONDONTWRITEBYTECODE=1 \
|
| 25 |
+
PATH="/app/.venv/bin:$PATH"
|
| 26 |
+
|
| 27 |
+
WORKDIR /app
|
| 28 |
+
|
| 29 |
+
# 創建非 root 用戶並設置權限
|
| 30 |
+
RUN groupadd -r appuser && useradd -r -g appuser -u 1000 appuser
|
| 31 |
+
# 預先創建虛擬環境目錄並授權,加速 COPY 流程
|
| 32 |
+
RUN chown appuser:appuser /app
|
| 33 |
+
|
| 34 |
+
USER appuser
|
| 35 |
+
|
| 36 |
+
# 從構建階段複製虛擬環境
|
| 37 |
+
COPY --from=builder --chown=appuser:appuser /app/.venv /app/.venv
|
| 38 |
+
|
| 39 |
+
# 複製應用代碼 (建議先複製代碼再啟動)
|
| 40 |
+
# 注意:如果項目很大,建議在 .dockerignore 中排除 .venv, .git 等
|
| 41 |
+
COPY --chown=appuser:appuser . .
|
| 42 |
+
|
| 43 |
+
# 暴露 FastAPI 默認端口或 Hugging Face Spaces 要求的端口
|
| 44 |
+
EXPOSE 7860
|
| 45 |
+
|
| 46 |
+
# 使用虛擬環境中的 uvicorn 啟動
|
| 47 |
+
# 增加 --proxy-headers 處理反向代理(如 Hugging Face 或 Nginx)
|
| 48 |
+
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860", "--proxy-headers"]
|