# syntax=docker/dockerfile:1.7 ############################## # 1) Base: Python 3.12 on Debian 12 (bookworm), slim 版 ############################## FROM python:3.12-slim-bookworm AS base # 取得套件清單、升級現有套件,並清理快取檔,縮小映像檔 RUN --mount=type=cache,target=/var/cache/apt \ apt-get update \ && apt-get -y upgrade \ && apt-get install -y --no-install-recommends ca-certificates curl \ && rm -rf /var/lib/apt/lists/* ############################## # 2) Tool stage: 從 uv 官方映像抓可執行檔 ############################## FROM ghcr.io/astral-sh/uv:latest AS uvbin ############################## # 3) Runtime: 把 uv 複製進來 + 建置專案 ############################## FROM base AS runtime # 複製 uv 執行檔 COPY --from=uvbin /uv /usr/local/bin/uv # 設定工作目錄 WORKDIR /app # --- 快取關鍵:先複製相依檔,再安裝 --- # 若你用 pyproject/uv.lock COPY pyproject.toml uv.lock* ./ # 若你是 requirements.txt 流程,也一起複製(可選) COPY requirements.txt* ./ # 安裝相依(優先使用 uv 的鎖定檔) # 1) 有 pyproject.toml/uv.lock:同步相依,但先不安裝專案本身(no-install-project) # 2) 否則退回 requirements.txt(若不存在此檔,指令會忽略) RUN set -eux; \ if [ -f "pyproject.toml" ]; then \ uv sync --frozen --no-dev --no-install-project; \ fi; \ if [ -f "requirements.txt" ]; then \ uv pip install -r requirements.txt; \ fi # 最後才複製所有程式碼(讓上面相依可以被 Docker layer 快取) COPY . . # 設 PYTHONPATH,讓程式能找到專案根目錄的模組 ENV PYTHONPATH=/app # 建立非 root 使用者,並給予 /app 權限 RUN useradd -m -u 10001 app \ && chown -R app:app /app USER app # 預設用 uv 的虛擬環境執行 Python(更安全、可重現) # 依你的專案啟動方式擇一: # - 若有 app 套件並可 python -m app 啟動 CMD ["uv", "run", "python", "-m", "app"] # - 或改為執行 main.py: # CMD ["uv", "run", "python", "main.py"]