Dockerfile Python
把 指令 兜成一個實際可用的 Python 應用 Dockerfile,重點在指令的順序。
典型 Python 應用
COPY requirements.txt 再 COPY . .? layer cache 的規則是「某層變了,後面所有層全部重建」(完整機制見 layer cache)。原始碼改動的頻率遠高於相依清單。如果先 COPY . . 再 pip install,每改一個 .py 都會害 pip install 整個重跑(很慢)。把相依清單單獨先複製、先裝,pip install 那層就只在 requirements.txt 真的變動時才重建。
pip install --no-cache-dir 讓 pip 不把下載的 wheel 快取留進映像層,縮小 image。
用 multi-stage 縮小映像
要更小的映像,用 multi-stage build:在 builder stage 裝好相依進 venv,最終 stage 只複製 venv,build 工具不進最終映像:FROM ... AS builder命名 build stage,COPY --from=builder從它複製產物。--mount=type=cache,target=/root/.cache/pip讓 pip 下載快取跨 build 持久化(不進映像層),重 build 不重複下載。- 最終映像只含 runtime 與 venv,沒有編譯工具,明顯更小。
接下來
- 選擇別人的映像:
python:3.12-slim跟 alpine、完整版怎麼選。 - Layer cache 與最佳實踐:快取機制與一份可抄的範本。