当前位置: 首页 > news >正文

docker容器中uv的使用

文章目录

    • TL;DR
    • `uv`简介
    • `uv`管理项目依赖
      • step 1
      • step 2
        • Windows
        • Linux/Mac
      • step 3
      • 依赖包恢复
    • 在`Docker`容器中使用`uv`

TL;DR

本文记录uv在docker容器中使用注意点,

uv简介

uv是用rust编写的一个python包管理器,特点是速度快,且功能强大,目标是替代pip,不仅能管理python项目的依赖,还能很容易的切换python版本(venv的方式). 更详细的介绍可以参考笔者的另一篇博客 uv: 一个统一的Python包管理工具.

uv管理项目依赖

用uv管理项目的依赖大致遵循以下的过程

step 1

初始化项目

uv init

uv会创建pyproject.toml来记录工程的版本信息,依赖包等.

step 2

创建venv,可以指定python版本,即使本地没有这个指定的python版本,uv也可以自动下载,这个就比poetry更好用了

uv venv --python 3.12

安装后激活环境

Windows
.\venv\Scripts\activate.ps1
Linux/Mac
.venv/bin/activate

step 3

安装依赖项,和pip 用法类似

uv add numpy

甚至还可以让uv运行pip安装

uv pip install numpy

注意,uv add是会把依赖包写入到pyproject.toml中的,但是uv pip install不会.

如果要使用镜像加速安装,和pip用法是一样的,例如

uv add numpy -i https://mirrors.aliyun.com/pypi/simple

依赖包恢复

uv会创建uv.lock来锁定依赖信息,确保在恢复的时候保持一致. 运行如下命令即可.

uv sync

Docker容器中使用uv

我们用一个fastapi的web项目来作为例子,基础镜像是 python:3.12-alpine.

在docker容器中使用uv,首先可以用pip安装

FROM python:3.12-alpineRUN pip install --no-cache-dir uv

然后copy 项目依赖信息,安装依赖

COPY pyproject.toml .
RUN uv sync

这样做是利用docker的cache机制,代码变更频率比依赖的变更频率高,在恢复依赖包之后再复制代码,可以有效加速image的build.

重点在下面:
实测发现,安装uv后直接uv sync,的确会成功的安装依赖,但是,安装的并非在base image的python目录下, uv自动创建了一个venv. 所以如果安装依赖后如果直接运行

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

此时会报找不到uvicorn,因为uv创建的venv不在系统的PATH中. 解决办法很简单,把这个目录加入到PATH

ENV PATH="/app/.venv/bin:$PATH"

这样就能运行了.

最终的Dockerfile大致如下,仅供参考

FROM python:3.12-alpine
WORKDIR /app
COPY pyproject.toml .
RUN pip install --no-cache-dir uv && \uv sync
ENV PATH="/app/.venv/bin:$PATH"
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

相关文章:

  • 前端性能优化全攻略:JavaScript 优化、DOM 操作、内存管理、资源压缩与合并、构建工具及性能监控
  • 从代码学习深度学习 - 异步计算 PyTorch 版
  • 深入理解无监督学习:探索数据的潜在结构
  • Android Studio调试中的坑二
  • Idea创建项目的搭建方式
  • this._uid:Vue 内部为每个组件实例分配的唯一 ID
  • 数字化转型“变形记”:中钧科技经营帮如何让企业长出“智慧骨骼”
  • Python简介
  • 搜索策略的基本概念
  • 【音视频】AAC-ADTS分析
  • Ubuntu与Linux的关系
  • Redis之Java操作redis
  • 性能比拼: Go vs Java
  • 反素数c++
  • 云原生--基础篇-4--CNCF-1-云原生计算基金会(云原生生态发展和目标)
  • 【文件上传/下载Java+vue3——MQ】
  • vue3新增特性
  • KUKA机器人KR 3 D1200 HM介绍
  • [Android]豆包爱学v4.5.0小学到研究生 题目Ai解析
  • Postman下载安装与使用汉化版教程
  • 安徽临泉一小区交付后多楼层现裂缝,专家组论证称不影响安全
  • 证券时报:金价再创历史新高,“避险”黄金不应异化为投机工具
  • 海南一季度GDP为1904.17亿元,同比增长4.0%
  • 关税飓风下的跨境电商人:已度过焦虑期,和中国做生意是美国最优解
  • 俄乌就不打击民用基础设施释放对话信号
  • 上海市政府常务会议部署多措并举促进消费,提高居民收入,减轻家庭负担