如何实现完全离线部署?
(目前是大文件离线部署,其余依赖在线下载,镜像构建时间为5分钟;之前全部文件在线下载时镜像构建时间是50分钟):
- 执行轻量 ubuntu 容器命令 → 增量下载 requirements 所有依赖到现有文件夹wheels;
- 独立命令下载 torch/torchaudio/torchvision cu130 三件套;
- 放入自制 cuda_toolkit-13.0.2-py3-none-any.whl stub 包;
- 离线模拟安装,验证是否 把 requirements 所有依赖 下载完毕;
- 执行 docker build 纯离线构建;
问题说明:
WSL 本地 Python3.12,容器目标是 Python3.11,如果下载 requirements 时不带--python-version 311、--platform manylinux_2_28_x86_64,pip 会默认下载适配本地 3.12 环境的 whl,放到 Ubuntu22.04(py3.11)容器里会出现 ABI 不兼容、安装失败。
计划这样写(错误写法):
bash
#错误写法
pip download \
-r requirements.txt \
-d ./wheels \
--extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple \
--platform manylinux_2_28_x86_64 \
--python-version 311 \
--only-binary=:all \
--no-binary :none: \
--trusted-host pypi.tuna.tsinghua.edu.cn
但是报错了,报错原因:
新版 pip 有强制语法互斥规则:
同时启用 --platform + --python-version ➡ 强制要求必须加上 --no-deps
一旦加了--no-deps,就不会自动递归下载子依赖。
之前想用--no-binary :none:绕过的方案在新版 pip 不生效,此路不通,放弃。
以下方案:绕开 pip 这个语法死锁:
一 。轻量临时镜像下载
需要一个 Ubuntu22.04 + python3.11 的环境用来执行 pip download:
bash
docker run --rm \
-v $(pwd):/work \
-w /work \
ubuntu:22.04 \
bash -c "
apt-get update && apt-get install -y --no-install-recommends python3.11 python3.11-dev python3-distutils ca-certificates curl;
update-ca-certificates;
ln -sf /usr/bin/python3.11 /usr/bin/python;
curl -fsSL --insecure https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py;
python3.11 /tmp/get-pip.py;
python3.11 -m pip download -r requirements.txt -d ./wheels \
--extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple \
--trusted-host pypi.tuna.tsinghua.edu.cn \
--only-binary=:all
"
--only-binary=:all 会静默丢弃没有 whl 的依赖,不告警、不提醒,离线阶段才爆发错误。存在仅有源码包的依赖时,会丢包。
这条命令只负责下载 requirements 普通依赖;
PyTorch 三件套沿用原来独立的下载命令(不能用这个容器下载 torch+cu130 特殊包)。
二。验证是否下载完全
验证是否把requirement的文件都成功下载到wheels文件夹中:
bash
docker run --rm \
-v $(pwd):/work \
-w /work \
ubuntu:22.04 \
bash -c "
apt-get update && apt-get install -y --no-install-recommends python3.11 python3.11-dev python3-distutils ca-certificates curl;
ln -sf /usr/bin/python3.11 /usr/bin/python;
curl -fsSL --insecure https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py;
python3.11 /tmp/get-pip.py;
python3.11 -m pip install -r requirements.txt \
--no-index \
--no-cache-dir \
--find-links=./wheels
"
"
三。关于临时镜像
1. 临时镜像是否占内存, 通常情况下,不会
命令带有 --rm 参数,这是核心保障:
bash
docker run --rm
规则:
容器进程正常跑完(安装成功 / 安装报错退出)→ 容器直接彻底销毁
容器内产生的临时 Python 环境、缓存全部删除
不会留下停止状态的僵尸容器
宿主机内存随容器销毁立刻释放
⚠️ 唯一例外:如果中途手动 Ctrl+C强制中断
部分场景下容器来不及执行销毁逻辑,会短暂残留。
2、万一卡住 / 中断,手动清理两条万能指令
① 清理残留容器
bash
# 清理所有停止的容器
docker container prune -f
② 清理镜像(可选,如果你不需要这个 ubuntu:22.04 缓存镜像)
bash
docker rmi ubuntu:22.04
3、挂载目录安全说明
-v $(pwd):/work 只是只读共享文件
模拟安装只会读取./wheels 里的 whl,不会修改、新增、删除你 Windows 侧任何文件,放心测试。