docker使用uv安装依赖

官方使用

FastAPI 官方 Dockerfile 中用了两次:

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 --frozen --no-install-project  # ✅ 第一次RUN --mount=type=cache,target=/root/.cache/uv \uv sync  # ✅ 第二次

这是 uv 官方推荐的优化构建流程,目的是 最大程度复用缓存,加快构建速度,同时支持源码变化重装依赖。

🔍 第一次 uv sync --frozen --no-install-project

📌 作用是:

• ✅ 只安装依赖(不安装你项目代码)

• ✅ 使用 lock 文件精确控制版本

• ✅ 构建中间层缓存(intermediate layer)

✔️ 只要你没改 pyproject.toml 或 uv.lock,这一层永远不需要重建!

这是 Docker 构建中非常重要的一环 —— 利用文件不变来缓存 layer,加快构建速度。

🔄 第二次 uv sync

📌 作用是:

• ✅ 安装你项目的源码(也就是 app/ 本身)

• 因为第一次用了 --no-install-project,项目代码没有装进去

🚨 如果你更新了项目源码,但没改 pyproject.toml,就只会触发第二次构建。

你可以类比为:

# 第一次,只安装依赖,不装项目代码
pip install --no-deps --require-hashes -r requirements.txt# 第二次,把你的项目当成 package 装进环境里
pip install .
# 是 Python 项目中非常重要的一步,表示 将你当前目录(.)下的项目当作一个 Package 安装到当前 Python 环境中。

这样你每次写代码改的是 .py 文件而不是依赖,Docker 就不会重新构建冗余层 ✅

第一次 uv sync --frozen --no-install-project第二次 uv sync
安装依赖项(构建缓存层)安装项目本身
不会安装你 app/ 源码会装源码到虚拟环境
对应 lock 文件(更可控)快速重建项目层
有利于构建性能有利于热更新和本地测试

可以,但你就会失去 中间层缓存优化的好处,每次改 .py 都会重新装全部依赖 ❌

✅ 为什么 FastAPI 官方不写 COPY?

因为他们使用的是 BuildKit 的多阶段构建 + bind mount 优化方案

•	第一次 RUN uv sync --frozen --no-install-project 使用挂载的 pyproject.toml 和 uv.lock 安装依赖(但不安装项目)
•	最终会在后面阶段,再使用 COPY . . 把项目代码拷贝进来
步骤是否合理说明
设置基础镜像python:3.12-slim 节省体积
使用 uv 构建快速高效、现代依赖工具
缓存依赖安装层加速构建、复用缓存
分阶段 COPY + uv sync减少变更触发重装
PYTHONPATH=.适配 from app.xxx 导入
CMD 使用 uvicorn适合线上部署、ASGI 原生

开箱即用的Dockfile

FROM python:3.12-slim AS builderWORKDIR /app# 设置时区为 UTC+8
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneCOPY --from=ghcr.io/astral-sh/uv:0.5.11 /uv /uvx /bin/ENV PATH="/app/.venv/bin:$PATH"
ENV UV_COMPILE_BYTECODE=1
ENV UV_LINK_MODE=copy# 复制项目文件到容器中
COPY . /app/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 --frozen --no-install-projectENV PYTHONPATH=.CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--log-level", "warning"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.0 Disruptor的使用介绍(一)

Disruptor: 其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。 其组成部分比较多,先介绍几个常用的概念: …

在 Windows 系统下,将 FFmpeg 编译为 .so 文件

1. 准备环境 确保你的 Windows 系统已安装以下工具: Android Studio NDK(Native Development Kit) MSYS2(用于提供类 Unix 环境) FFmpeg 源码 Git Bash(可选,推荐使用) 安装 …

leetcode二叉树3

404.左叶子之和 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24示例 2: 输入: root [1] 输…

QT网络通信的接口与使用

文章目录 前言1.服务端实现流程1.1步骤 1:创建 QTcpServer 并监听端口1.2步骤 2:处理新连接请求1.3步骤 3:接收客户端数据1.4步骤 4:处理客户端断开 2.客户端实现流程2.1步骤 1:创建 QTcpSocket 并连接服务器2.2步骤 2…

华为OD机试2025A卷七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第1期五、精心挑选21道高频100分经典题目,作为入门。第1天、逻辑分析第2天、逻辑分析第3天、逻辑分析第4天、逻辑分析第5天、双指针第6天、二叉树第7天、回溯 六、集训总结六、国内直接使用最新GPT-4.5、满…

Qt 重入和线程安全

重入和线程安全 在整个文档中,"重入"和 "线程安全 "这两个术语被用来标记类和函数,以表明它们在多线程应用程序中的使用方式: 线程安全函数可以同时被多个线程调用,即使调用使用的是共享数据,因…

Elasticsearch:构建 AI 驱动的搜索体验

Elasticsearch 介绍 当你开始使用 Elastic 时,你将使用 Elasticsearch Relevance Engine™(ESRE),它专为 AI 搜索应用程序提供支持。借助 ESRE,你可以利用一整套开发者工具,包括 Elastic 的文本搜索、向量…

鸿蒙生态开发

鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙(OpenHarmony)构建的分布式操作系统生态,旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务,覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…

JVM如何处理Java中的精度转换: 从源码到字节码

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

vue-next-admin修改配置指南

官方文档地址:vue-next-admin 1.如何开启侧边栏logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 设置为true即可默认打开 2.修改侧边栏顶部的logo与文字 先把想要的图标存到我的项目然后下载 然后把后面的几个文件拉…

gin学习

gin学习笔记,不仅包含了基本的增删查改外,还包括参数传递,上传下载,模版、session与中间件等,方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…

Flutter运行错误:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行,结果一直跑不起来,错误日志如下: 执行命令查看版本信息: flutter doctor --verbose通过输出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【计算机网络运输层详解】

文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议:TCP 和 UDP1. TCP:面向连接的可靠传输协议2. UDP:无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…

51单片机和STM32 入门分析

51单片机和STM32是嵌入式开发中两种主流的微控制器,它们在架构、性能、应用场景等方面存在显著差异。以下是两者的对比分析及选择建议: 1. 51单片机与STM32的定义与特点 51单片机 定义:基于Intel 8051内核的8位微控制器,结构简单…

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域,构建能够像人类一样理解、思考和行动的智能体(AI Agent)一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期,国内人工智能公司MiniMax重磅开源了其…

excel 列单元格合并(合并列相同行)

代码 首先自定义注解CellMerge,用于标记哪些属性需要合并,哪个是主键**(这里做了一个优化,可以标记多个主键)** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable适配达梦7 (2.1)

经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一键部署

新项目旧项目都需要给研发配置mysql监控,这里mysql监控对应aws 阿里云 腾讯云 华为云的云mysql产品或开源自建mysql。 exporter安装虽然简单,经常手动操作不免让人心烦,一键完成省去繁琐的常规操作。 配置信息对的情况下测试多次都可以正常安…

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质:缩短首次可见帧渲染时间。 方法: iOS:利用Core ML本地模型轻量化部署,减少云端等待。Android:强制启用SplashScreen API,通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…