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.pswp.cn/web/73317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73317.shtml
英文地址,請注明出處:http://en.pswp.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控制動畫時長。冷啟動需將耗時操…