用 uv 管包 + 用 Docker 跑 Python 项目(实战总结)
·
🚀大模型落地开发实战指南!请关注微信公众号:「AGI启程号」 深入浅出,助你轻松入门!
📚 数据分析、深度学习、大模型与算法的综合进阶,尽在CSDN博客主页
目录
用 uv 管包 + 用 Docker 跑 Python 项目(实战总结)
适合场景:Windows/PowerShell 开发、需要“可复现环境”、本地 + 容器双跑、要用到 HuggingFace 缓存、以及接第三方 OpenAI 兼容 API(如 DashScope/Qwen)。
在做 Python 项目(特别是模型评测、RAG、训练相关)时,经常会遇到这些痛点:
- 本地依赖和容器依赖不一致,环境一换就挂;
- Windows 开发,Linux 容器,某些包(如
pywin32)根本装不上; - HuggingFace 下载慢,镜像重装时数据反复拉取;
.env配置不规范,API Key 或 URL 总是报错。
我在近期项目中踩过这些坑,最终总结出一套「Conda + uv 管包」+「Docker 部署」的实践流程。
0. 准备工作:虚拟环境与依赖管理
0.1 Conda 和 uv/venv 的关系
-
Conda 建环境,uv 管包:
- Conda 负责建虚拟环境,解决 Python 版本、CUDA 依赖等底层问题。
- uv/venv 负责 Python 包安装速度与依赖解析。
-
如果你已经在用 Conda 新建了虚拟环境,就不需要再用
uv venv。只要在 Conda 环境里直接用uv pip install即可。
👉 最佳实践:
# 新建 Conda 环境
conda create -n pj310 python=3.10
# 激活环境
conda activate pj310
# 在 Conda 环境里用 uv 装包(替代 pip)
uv pip install -r requirements.txt
0.2 什么是“冻结依赖”?
- requirements.txt:开发用的主依赖清单(版本可以宽一些)。
- 冻结依赖(freeze):把当前环境里实际安装的所有包及精确版本记录下来,用于复现或上线。
# 生成冻结依赖(PowerShell)
uv pip freeze --exclude-editable | Out-File -Encoding utf8 requirements-freeze.txt
# 从冻结文件安装(保证100%一致)
uv pip install -r requirements-freeze.txt
👉 实战建议:
- 开发时:用
requirements.txt - 上线/归档时:生成一份
requirements-freeze.txt
0.3 常见报错与解决
| 报错提示 | 常见原因 | 解决方案 |
|---|---|---|
No virtual environment found |
你在用 uv pip,但没在 venv/Conda 环境中 |
先激活环境,或加 --system |
No solution found when resolving dependencies |
包不兼容(Linux 容器装 pywin32) |
分平台 requirements,或用条件依赖:pywin32 ; sys_platform=="win32" |
| 硬链接(hardlink)警告 | 跨盘符复制 | 可忽略,或设置 $env:UV_LINK_MODE="copy" |
1. Docker 入门:5 条命令够用
先理解几个概念:
- 镜像(Image):打包好的环境 + 程序的模板
- 容器(Container):镜像跑起来的实例
- 构建(build):生成镜像
- 运行(run):从镜像启动容器
常用命令(够用版):
# 构建镜像
docker build -t pj-model-eval:py310 .
# 启动容器
docker run --rm -it --env-file .env -v "F:\code:/work" pj-model-eval:py310
# 查看运行中的容器
docker ps
# 进入容器
docker exec -it <容器ID> bash
# 停止容器并删除
docker stop <容器ID> && docker rm <容器ID>
2. Dockerfile 示例(逐行解释)
# 选择基础镜像:官方 Python 3.10 精简版
FROM python:3.10-slim
# 安装系统工具(git、编译工具链),并清理缓存减小体积
RUN apt-get update \
&& apt-get install -y --no-install-recommends git build-essential \
&& rm -rf /var/lib/apt/lists/*
# 设置容器内的工作目录
WORKDIR /work
# 安装 uv 并创建虚拟环境(容器内部)
RUN python -m pip install -U pip uv && uv venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# 拷贝依赖清单并安装(触发缓存命中)
COPY requirements.txt /tmp/requirements.txt
RUN uv pip install -r /tmp/requirements.txt
# 默认进入 bash
CMD ["bash"]
注意点:
- 容器里是 Linux,不要把 Windows 包(如
pywin32)写进requirements.txt。 - 开发时建议挂载代码(-v),而不是 COPY 全部项目。
3. .env 文件配置规范
DASHSCOPE_API_KEY=sk-xxxxxxxx
OPENAI_API_KEY=${DASHSCOPE_API_KEY}
OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
EMBEDDING_API_KEY=${DASHSCOPE_API_KEY}
EMBEDDING_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
EMBEDDING_MODEL=text-embedding-v4
注意:
- 不要加引号
- 不要写行内注释
4. HuggingFace 缓存挂载
避免容器内重复下载模型:
docker run --rm -it `
--env-file .env `
-e HF_HOME=/hf_cache `
-v "F:\hf_cache:/hf_cache" `
-v "F:\working\pj - model_eval:/work" `
pj-model-eval:py310
5. 在容器里运行项目
# 进入容器后执行
python scripts/run_all.py
或分步运行:
python scripts/run_reasoning.py
python scripts/run_rag.py
6. 推荐依赖分层
requirements.txt(通用依赖)requirements.win.txt(Windows 专属包,如 pywin32)requirements-freeze.txt(冻结依赖,保证100%复现)
7. 经验总结(踩坑清单)
.env文件禁止加引号、注释- Windows 路径有空格 → 用引号
- HuggingFace 缓存一定要挂载出来
- Windows/Linux 依赖分开写
- Dockerfile 尽量拆层,缓存命中更快
🔚 总结
我的实践流程:
- Conda 建环境 → uv 管包(速度快 + 兼容性好)
- Docker 复现(可移植 + 不受平台限制)
- 缓存挂载 + freeze(提速 + 可回滚)
这样无论是本地开发,还是容器化部署,都能做到稳定、可复现、少踩坑。
要不要我帮你在这篇博客开头,再加一个 目录(TOC),方便跳转各个小节?
更多推荐



所有评论(0)