UV python 基础使用教程、docker部署实例
UV是一个高性能Python包管理工具,比pip快10-100倍,支持现代依赖管理流程。它通过uv init初始化项目,uv add添加依赖,自动维护pyproject.toml和uv.lock文件。支持虚拟环境管理和Python版本切换,兼容旧项目迁移(uv add -r requirements.txt)。在Docker部署中,推荐使用预装UV的镜像,通过挂载缓存和绑定依赖文件实现高效构建。配
类似 pip 的包管理器,但速度比 pip 快 10 到 100 倍
虚拟环境管理器,用的就是 venv,只是可通过uv操作venv
安装
windows安装,可在Powershell通过命令行安装(以管理员权限打开)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
macOS/Linux安装,通过 curl 下载并执行安装脚本
curl -LsSf https://astral.sh/uv/install.sh | sh
验证是否安装成功
uv --version
![]()
使用方式
UV 不只是一个包安装器,它支持完整的 Python 项目结构和现代依赖管理流程,天然支持 pyproject.toml
1. 初始化项目
1.1. 新建项目目录,在路径输入框中输入CMD、回车,会自动打开命令行,且命令行的当前位置就是该目录


1.2. 项目初始化
uv init

由于uv会建一个.git文件,但是本机没有装git,所以出现报错,但是不影响初始化
初始化后,文件夹下会出现以下内容

1.3. 项目同步
uv sync

会生成以下两个文件:
.venv,是生成python虚拟环境,python版本由pyproject.toml中的requires-python = ">=3.12"决定的uv.lock文件,记录确切的依赖版本,确保开发与部署环境一致。无需再维护多个*.txt文件。

2. 项目开发
2.1. 添加依赖:
使用 uv add 安装新依赖,并自动写入 pyproject.toml 与 uv.lock
# 示例,添加requests包
uv add requests
2.2. python版本切换:
在 pyproject.toml中修改 requires-python = ">=3.12" 即可,修改完后,重新输入命令,即可同步给.lock:
uv sync
3. 旧项目迁移(从 requirements.txt 迁移)
UV 支持一键导入已有依赖文件,适合旧项目迁移:
uv add -r requirements.txt
-r 指定依赖列表
UV 会将其中的包导入至 pyproject.toml,并安装到 .venv 中。
docker部署(实践记录)
步骤:
docker是先创建镜像,再通过镜像创建运行实例(容器)
- 需要Dockerfile创建python程序镜像,以及运行方式
- 通过docker-compose.yml创建、运行容器,并指定通过Dockerfile的内容创建镜像
1. 创建Dockerfile文件:
粗暴的来说,如果是通过main.py作为运行主文件,都可以直接使用这个文件
# 使用预装了 uv 的 Python 镜像
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
# 将项目安装到 `/app` 目录
WORKDIR /app
# 启用字节码编译
ENV UV_COMPILE_BYTECODE=1
# 由于是挂载卷,从缓存复制而不是链接
ENV UV_LINK_MODE=copy
# 确保安装的工具可以开箱即用
ENV UV_TOOL_BIN_DIR=/usr/local/bin
# 使用锁文件和设置安装项目的依赖
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --locked --no-install-project --no-dev
# 然后,添加项目的其余源代码并安装
# 与依赖分开安装可以实现最佳的层缓存
COPY . /app
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --locked --no-dev
# 将可执行文件放在环境路径的前面
ENV PATH="/app/.venv/bin:$PATH"
# 重置入口点,不调用 `uv`
ENTRYPOINT []
# 默认运行main.py的主函数
CMD ["uv", "run", "main.py"]
2. docker-compose.yml:
hefeng-api部分就是主要配置内容,后半部分主要是nginx反向代理的配置,以及服务之间通信的docker网络配置
build: # 构建镜像的配置
context: . # 构建上下文为当前目录
dockerfile: Dockerfile # 使用当前目录下的 Dockerfile 文件
version: '3.8' # 指定 Docker Compose 文件格式版本为 3.8
services: # 定义服务
hefeng-api: # 定义名为 hefeng-api 的服务
build: # 构建镜像的配置
context: . # 构建上下文为当前目录
dockerfile: Dockerfile # 使用当前目录下的 Dockerfile 文件
env_file: # 指定环境变量文件
- .env # 使用当前目录下的 .env 文件
environment: # 设置环境变量
- PORT=8000 # 设置 PORT 环境变量为 8000
volumes: # 挂载卷
- .:/app # 将当前目录挂载到容器的 /app 目录
restart: unless-stopped # 重启策略:除非手动停止,否则自动重启
expose: # 暴露端口(仅对链接的服务可见)
- 8000
networks: # 指定网络
- app-network # 使用名为 app-network 的网络
nginx: # 定义名为 nginx 的服务
image: nginx:alpine # 使用 nginx:alpine 镜像
ports: # 端口映射
- "80:80" # 将主机的 80 端口映射到容器的 80 端口
volumes: # 挂载卷
- ./nginx.conf:/etc/nginx/nginx.conf # 将当前目录下的 nginx.conf 文件挂载到容器的 /etc/nginx/nginx.conf
depends_on: # 依赖关系
- hefeng-api # 依赖 hefeng-api 服务
networks: # 指定网络
- app-network # 使用名为 app-network 的网络
networks: # 定义网络
app-network: # 定义名为 app-network 的网络
driver: bridge # 使用 bridge 驱动更多推荐
所有评论(0)