镜像里的 pip 安装
Python 项目在镜像里装依赖的常规写法是:先复制依赖清单再安装,默认加 --no-cache-dir 避免 wheel 缓存写进镜像。若改用缓存挂载加速,就不要加这个参数,两者同时出现会互相抵消。
基本信息
| 顺序 | 先复制依赖清单再安装,最后复制源码 |
|---|---|
| 常规命令 | pip install --no-cache-dir -r requirements.txt |
| 加速写法 | 配合 RUN --mount=type=cache 时不要加 --no-cache-dir |
| 可复现 | 生产环境使用锁定版本的依赖清单或约束文件 |
| 解释器 | 系统 Python 与虚拟环境不要混用 |
典型使用场景
- 常规服务镜像:只装生产依赖,不带测试与调试包
- 多阶段构建:构建阶段编译 wheel,运行阶段直接安装编译结果
- 内网环境:指定镜像源与可信主机,让安装走内部制品库
- 需要编译的依赖(带 C 扩展)先装构建工具,最终镜像不带工具链
- 排查线上依赖版本与本地不一致:核对镜像里的依赖清单与锁定方式
- 给命令行工具做镜像时用精简的依赖清单,控制镜像体积
示例
示例
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 用缓存挂载加速时不要再加 --no-cache-dir
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
# 内网源(按实际环境填写地址)
RUN pip install --no-cache-dir --index-url https://mirrors.example.com/pypi/simple -r requirements.txt安装方式对照
| 写法 | 效果 | 适用场景 |
|---|---|---|
| --no-cache-dir -r | 不保留 wheel 缓存 | 常规生产镜像 |
| 缓存挂载 + -r | 复用下载缓存且不写进镜像 | 构建频繁、依赖较多的项目 |
| 锁定版本的清单 | 安装结果可复现 | 生产环境必备 |
| --user 安装 | 装到用户目录 | 无 root 权限的运行环境 |
不锁版本时同一份 Dockerfile 在不同时间可能装到不同依赖,问题难以复现,生产镜像应当基于锁定后的依赖清单构建。
系统 Python 与虚拟环境混用会让依赖位置混乱,镜像里保持单一安装方式,别一边用系统解释器一边又建虚拟环境。
需要编译的包会把构建工具链带进来,放进多阶段构建的构建阶段,运行阶段只带走编译好的产物与运行依赖。