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

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"]
http://www.xdnf.cn/news/1093.html

相关文章:

  • ARM汇编的LDM和STM指令
  • 【sylar-webserver】重构 增加内存池
  • weibo_har鸿蒙微博分享,单例二次封装,鸿蒙微博,微博登录
  • 基于 WebRTC + Pion + HeyGem.ai 实现可互动的数字人系统
  • 安徽京准:关于石油管道监控NTP时间同步服务器方案
  • kafka auto.offset.reset详解
  • 【Qt】QDialog类
  • WebRTC服务器Coturn服务器的管理平台功能
  • 最新扣子(Coze)案例教程:飞书多维表格按条件筛选记录 + 读取分页Coze工作流,无限循环使用方法,手把手教学,完全免费教程
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之显示勾选的购物车数据和创建订单
  • 电气动调节单座V型球阀带阀杆节流套沟槽孔板的作用-耀圣
  • 【华为HCIP | 华为数通工程师】821—多选解析—第十二页
  • 【MySQL】MySQL 表的增删改查(CRUD)—— 下篇(内含聚合查询、group by和having子句、联合查询、插入查询结果)
  • Linux信号的产生
  • Qt绘制可选择范围的日历
  • 嘻游电玩三端客户端部署实战:PC + Android + iOS 环境全覆盖教程
  • 【数据结构】励志大厂版·初级(二刷复习)双链表
  • HCIP(OSPF)(3)
  • 缓存与内存;缺页中断;缓存映射:组相联
  • Linux内核编译(Ubuntu)
  • IOT项目——DIY Weather Station With ESP32
  • Git Flow分支模型
  • C语言高频面试题——结构体和联合体区别
  • Selenium+Java 环境搭建
  • Redis
  • 使用python调用deepseek 多轮对话,详细讲解
  • start_response详解
  • 无线定位技术中的 IQ 采样:深度解析与实战指南
  • 辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目
  • 测试基础笔记第八天