docker使用uv安装依赖

官方使用

FastAPI 官方 Dockerfile 中用了两次:

python 复制代码
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,就只会触发第二次构建。

你可以类比为:

python 复制代码
# 第一次,只安装依赖,不装项目代码
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

python 复制代码
FROM python:3.12-slim AS builder

WORKDIR /app

# 设置时区为 UTC+8
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

COPY --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-project

ENV PYTHONPATH=.

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--log-level", "warning"]
相关推荐
JesseDev8 小时前
Docker lnmp环境快速搭建开箱即用
运维·docker·容器
空中海9 小时前
Docker入门到精通
java·docker·eureka
小义_9 小时前
【Kubernetes】(十二)配置存储卷
云原生·容器·kubernetes
BduL OWED10 小时前
Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像
docker·容器·tomcat
.柒宇.10 小时前
AI掘金头条项目 Docker Compose 部署完整教程(附踩坑记录)
运维·后端·python·docker·容器·fastapi
运维全栈笔记1 天前
K8S部署Redis高可用全攻略:1主2从3哨兵架构实战
redis·docker·云原生·容器·架构·kubernetes·bootstrap
SCBAiotAigc1 天前
2026.5.1:`DockerDesktop must be owned by an elevated account`错误的解决办法
人工智能·docker·具身智能
AI木马人1 天前
9.人工智能实战:GPU 服务如何上 Kubernetes?从单机部署到 K8s + NVIDIA Device Plugin + HPA 的生产级改造
人工智能·容器·kubernetes
一直会游泳的小猫1 天前
uv - 极速 Python 包管理器
python·工具·uv·包管理
爱吃巧克力的程序媛1 天前
计算机图形学---在OpenGL中,什么是归一化 UV 坐标?
人工智能·计算机视觉·uv