Image Python
不是每次都自己從零寫,多數時候是站在別人建好的映像上(FROM)。挑映像看兩件事:可信度與版本變體。
可信度:三個層級
| 類別 | 識別 | 維護者 |
|---|---|---|
| Docker Official Images | 路徑無使用者前綴(python、ubuntu)、有官方徽章 | Docker 親自策展 |
| Verified Publisher | 有「Verified Publisher」徽章,路徑帶廠商名 | 經審核的商業廠商 |
| 社群映像 | 格式 username/image、無徽章 | 個別使用者,靠下載數與聲譽判斷 |
Python 映像變體
以 Python 官方映像為例,撥下面幾個看差異:Alpine 的雷
Alpine 用 musl libc 而非 glibc,造成:- PyPI 上預編譯的 binary wheel(manylinux,以 glibc 為目標)在 Alpine 上會退回原始碼編譯,要在映像內裝
gcc/musl-dev與各套件的 C headers,build 時間大增、最終 image 未必更小。 - numpy、scipy、pandas、PyTorch、TensorFlow 這類科學運算 / ML 套件,在 Alpine 上需自行編譯或用非官方包,不建議。
- Alpine 適合純 Python(無 C extension 相依)、對映像大小有強制要求、且願意接受 multi-stage 裡的編譯成本。
選版本的通則
- 固定
major.minortag(python:3.12-slim),別用latest或python:3。 - 預設用 slim,要編譯原生套件時自己補 build 工具。
bookworm= Debian 12、bullseye= Debian 11,需要鎖定 Debian 版本時用帶代號的 tag(python:3.12-slim-bookworm)。
接下來
- 配合 Python 程式:用 slim 寫一個實際 Dockerfile。
- Layer cache 與最佳實踐:固定 tag、非 root 等最佳實踐。