ynyg commited on
Commit
983fc33
·
verified ·
1 Parent(s): 3acb4bf

feat: 更改為使用uv管理

Browse files
Files changed (1) hide show
  1. Dockerfile +43 -8
Dockerfile CHANGED
@@ -1,13 +1,48 @@
1
- FROM python:3.14
 
2
 
3
- RUN useradd -m -u 1000 user
4
- USER user
5
- ENV PATH="/home/user/.local/bin:$PATH"
6
 
7
  WORKDIR /app
8
 
9
- COPY --chown=user ./requirements.txt requirements.txt
10
- RUN pip install --no-cache-dir --upgrade -r requirements.txt
 
 
 
 
11
 
12
- COPY --chown=user . /app
13
- CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"]