最終更新 3 months ago

此 Dockerfile 用於建立一個基於 Python 3.12 的輕量級 Docker 映像,從 Debian 12 (bookworm) 開始,安裝必要的依賴,並使用 uv 工具來管理 Python 環境和執行應用。它包括多階段構建以優化映像大小和安全性,並設置非 root 使用者來執行應用。

.dockerignore Raw
1.git
2__pycache__/
3*.pyc
4*.pyo
5*.pyd
6*.swp
7.env
8.venv
9.uv/
10dist/
11build/
12.eggs/
13.coverage
14.pytest_cache/
15node_modules/
16
Dockerfile Raw
1# syntax=docker/dockerfile:1.7
2
3##############################
4# 1) Base: Python 3.12 on Debian 12 (bookworm), slim 版
5##############################
6FROM python:3.12-slim-bookworm AS base
7
8# 取得套件清單、升級現有套件,並清理快取檔,縮小映像檔
9RUN --mount=type=cache,target=/var/cache/apt \
10 apt-get update \
11 && apt-get -y upgrade \
12 && apt-get install -y --no-install-recommends ca-certificates curl \
13 && rm -rf /var/lib/apt/lists/*
14
15##############################
16# 2) Tool stage: 從 uv 官方映像抓可執行檔
17##############################
18FROM ghcr.io/astral-sh/uv:latest AS uvbin
19
20##############################
21# 3) Runtime: 把 uv 複製進來 + 建置專案
22##############################
23FROM base AS runtime
24
25# 複製 uv 執行檔
26COPY --from=uvbin /uv /usr/local/bin/uv
27
28# 設定工作目錄
29WORKDIR /app
30
31# --- 快取關鍵:先複製相依檔,再安裝 ---
32# 若你用 pyproject/uv.lock
33COPY pyproject.toml uv.lock* ./
34# 若你是 requirements.txt 流程,也一起複製(可選)
35COPY requirements.txt* ./
36
37# 安裝相依(優先使用 uv 的鎖定檔)
38# 1) 有 pyproject.toml/uv.lock:同步相依,但先不安裝專案本身(no-install-project)
39# 2) 否則退回 requirements.txt(若不存在此檔,指令會忽略)
40RUN set -eux; \
41 if [ -f "pyproject.toml" ]; then \
42 uv sync --frozen --no-dev --no-install-project; \
43 fi; \
44 if [ -f "requirements.txt" ]; then \
45 uv pip install -r requirements.txt; \
46 fi
47
48# 最後才複製所有程式碼(讓上面相依可以被 Docker layer 快取)
49COPY . .
50
51# 設 PYTHONPATH,讓程式能找到專案根目錄的模組
52ENV PYTHONPATH=/app
53
54# 建立非 root 使用者,並給予 /app 權限
55RUN useradd -m -u 10001 app \
56 && chown -R app:app /app
57USER app
58
59# 預設用 uv 的虛擬環境執行 Python(更安全、可重現)
60# 依你的專案啟動方式擇一:
61# - 若有 app 套件並可 python -m app 啟動
62CMD ["uv", "run", "python", "-m", "app"]
63# - 或改為執行 main.py:
64# CMD ["uv", "run", "python", "main.py"]
65