使用 uv 优化 Docker 镜像构建
前言
在 Python 项目中,使用 uv 作为包管理工具可以显著提升依赖安装速度。本文介绍如何用 uv 优化 Docker 镜像构建,实现更好的缓存命中和更小的镜像体积。
核心思路
uv 的设计目标之一就是快,这体现在 Docker 构建场景中就是:
- 更小的基础镜像 - 不需要预装 pip、venv 等
- 更好的缓存命中 - 分离依赖安装和代码拷贝
- 更快的安装速度 - uv 安装依赖比 pip 快 10-100 倍
完整 Dockerfile 示例
1 | |
关键步骤解析
1. 安装 uv
1 | |
直接用 pip 安装 uv,这是官方推荐的方式。安装后立即拥有极速的包管理能力。
2. 分离依赖和代码
1 | |
关键点:
- 先只拷贝依赖文件,不拷贝代码
- 这样即使代码变了,只要
pyproject.toml和uv.lock没变,Docker 就能命中缓存 --frozen确保使用锁文件版本,不会有意外更新--no-dev不安装开发依赖,减小镜像体积
3. 使用 BuildKit 缓存
1 | |
--mount=type=cache 是 Docker BuildKit 的特性,它会在多次构建之间保留 uv 的缓存目录,即使这一层重新构建,缓存依然可用。
4. 添加 venv 到 PATH
1 | |
把 .venv/bin 加入 PATH 后,启动命令可以直接写 uvicorn 而不需要写完整路径。
构建命令
确保开启了 BuildKit:
1 | |
注意事项
- uv.lock 必须提交到仓库 - 使用
--frozen依赖锁文件 - BuildKit 必须开启 -
--mount=type=cache需要 BuildKit 支持 - 不要在镜像中开发 - 所有依赖都是锁定版本,适合生产部署
- 基础镜像选择 - 可以用官方
python:3.13-slim,也可以用公司内部定制镜像
对比传统 pip 方式
| 特性 | pip | uv |
|---|---|---|
| 安装速度 | 慢 | 极快(10-100x) |
| 缓存复用 | 差 | 好(BuildKit cache) |
| 锁文件 | 需手动维护 | 自动生成 |
| 镜像体积 | 较大 | 较小 |
总结
使用 uv 优化 Docker 构建的核心在于:
- 分离依赖安装和代码拷贝,最大化缓存命中
- 利用 BuildKit 的 cache mount 保留下载缓存
- 精简依赖,只安装生产环境所需的包
这样构建出来的 Docker 镜像既小又快,是现代化 Python 项目部署的最佳实践。
使用 uv 优化 Docker 镜像构建
https://blog.iding.qzz.io/2026/02/uv-docker/
转发请注明出处