如何使用 Python 套件管理工具「uv」取代 pip 來加速 Docker Image 的建立

  1. 前言
  2. 什麼是 uv?
  3. uv 的使用方法
    1. 本機
    2. Dockerfile
  4. 實測檔案
    1. Dockerfile Using pip
    2. Dockerfile Using uv
    3. requirements.txt
  5. Linux Ubuntu 上進行 docker build
    1. 使用 pip = 87.6 秒
    2. 使用 uv = 33.3 秒
  6. GCP Cloud Shell 上進行 docker build
    1. 使用 pip = 20.1 秒
    2. 使用 uv = 11.7 秒
  7. 總結

前言

在 Build Docker Image 的時候,通常最花時間的都是安裝套件,為了突破這個效能瓶頸,這次決定嘗試使用 uv 來取代 pip 進行 Python 套件的安裝。

什麼是 uv?

uv 是一個以 Rust 撰寫的 Python 套件管理工具,號稱比 pip 還要快 10-100 倍,國外也有相關實測,像是 Streamlit 在 2024 年 7 月就有發 blog 表示他們用 uv 取代 pip 後速度提升了 55%(如圖 1)。

(2025/05更新)
近期發現開始有開源專案的官網文件也已經預設是使用 uv 來安裝,例如 Prefect(如圖 2)。

之前我也有在本機實測過,確實有非常顯著地提升了效能,而這次我打算將 uv 運用在 Docker 上,讓 Docker image 的建立時間能大幅縮減。

圖 1:Streamlit 用 uv 取代 pip 後速度提升了 55%
圖 2:開源專案 Prefect 的官網也已經預設是使用 uv 來安裝

uv 的使用方法

本機

uv 在本機的使用方法,跟平常的 pip 非常相似,只要安裝 uv 後把原本的 pip 指令改成 uv pip 指令就可以,例如:

(若是想了解 uv 在 Python 專案上的開發流程:如何使用 uv 取代 pip 來改善 Python 專案的開發流程)

Dockerfile

若是在 Dockerfile 中想要使用 uv,則不是使用 pip 安裝,而是透過 COPY 讓我們能使用 uv 指令:

並且要將原本的 uv pip install 加上 --system避免 Python PATH 錯誤

實測檔案

Dockerfile Using pip

FROM python:3.11-slim
WORKDIR /api
COPY . /api
RUN pip install –no-cache-dir -r requirements.txt
CMD ["fastapi", "dev", "app.py", "–host", "0.0.0.0", "–port", "8080"]
view raw pip.Dockerfile hosted with ❤ by GitHub

Dockerfile Using uv

FROM python:3.11-slim
WORKDIR /api
COPY . /api
COPY –from=ghcr.io/astral-sh/uv:latest /uv /bin/uv
RUN uv pip install –system –no-cache-dir -r requirements.txt
CMD ["fastapi", "dev", "app.py", "–host", "0.0.0.0", "–port", "8080"]
view raw uv.Dockerfile hosted with ❤ by GitHub

requirements.txt

另外一個檔案是 requirements.txt,因為這次打算使用 FastAPI 和 GCP 的 Pub/Sub 服務搭建一個 Data Streaming 的 API 服務,所以只需要安裝以下兩個套件

以下是實測的紀錄


Linux Ubuntu 上進行 docker build

使用 pip = 87.6 秒

使用 uv = 33.3 秒

GCP Cloud Shell 上進行 docker build

使用 pip = 20.1 秒

使用 uv = 11.7 秒


總結

先用表格整理一下實測結果:

(單位:秒)pipuv效能提升
Linux Ubuntu87.633.32.63x
Cloud Shell20.111.71.71 x

這次實測後發現 uv 非常明顯地提升了 Docker Image 的建立過程,可以達到 pip 2 倍以上的速度,而且這次只有指定安裝兩個套件,如果環境需要更多套件或是像 PyTorch 那種龐大的套件的話,效果我覺得應該會更顯著!

總之,目前我個人會考慮以後開發都用 uv 來代替 pip!

在〈如何使用 Python 套件管理工具「uv」取代 pip 來加速 Docker Image 的建立〉中有 1 則留言

回覆給如何使用 uv 取代 pip 來改善 Python 專案的開發流程 – JumpingCode 資料科學手記 取消回覆