将dockerfile改进为多阶段dockerfile的决策过程
**
主要是版本(–user + 环境变量) 与 版本(全局拷贝 /usr/local/*)的区别
可跳过一二三,直接看 <<四.版本A和版本B在各自优劣上 进阶优化>>。
**
这是我原来的dockerfile
# 1. 指定基础环境
FROM python:3.11-slim
# 2. 设置工作目录
WORKDIR /app
# 3. 先复制依赖文件并安装 (利用缓存层加速)
COPY requirements.txt .
# 4.更新源并安装 libmagic(这是 python-magic 在 Linux 下需要的底层库)
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' \
/etc/apt/sources.list.d/debian.sources && \
apt-get update && \
apt-get install -y libmagic1 --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
# 5. 复制离线 wheels 目录(必须在 pip install 前)
COPY wheels/ /tmp/wheels
# 6. 安装离线包(优先安装大体积、易超时的包)
# 注意:这里只安装 .whl 文件,不走 requirements.txt(避免重复)
#【重要】链接 spaCy 模型(必须在安装 .whl 后立即执行!)
RUN pip install --no-cache-dir \
/tmp/wheels/en_core_web_sm-3.8.0-py3-none-any.whl \
/tmp/wheels/torch-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchaudio-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchvision-0.21.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/sentence_transformers-5.3.0-py3-none-any.whl \
/tmp/wheels/chromadb-1.5.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
/tmp/wheels/onnxruntime_gpu-1.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl && \
python -m spacy link en_core_web_sm en_core_web_sm && \
python -c "import spacy; nlp = spacy.load('en_core_web_sm'); print('✅ spaCy model linked successfully')"
# 8. 安装其余轻量依赖(在线,快速)
RUN pip install --no-cache-dir \
--find-links /tmp/wheels \
-r requirements.txt \
-i https://pypi.tuna.tsinghua.edu.cn/simple/ \
--timeout 300 --retries 10 --progress-bar off
#wheels 目录:离线安装包(类似于 Windows 上的 .exe 安装程序或安卓的 .apk)。
#在安装完成后就没用了,但会占用 ~3GB+ 空间
RUN rm -rf /tmp/wheels
# 9. 复制代码
#COPY . .
# (此时 .dockerignore 会生效,自动跳过 data/models 等)
# 注意:这里只复制 code, web, sqlibrary 等必要代码
#COPY 源路径 目标路径
COPY code/ ./code/
#COPY data/ ./data/
# 10.创建必要的目录结构 (因为 data 文件夹被忽略了,容器内需要手动建一下空目录)
RUN mkdir -p /app/data/models /app/data/chroma_db /app/data/logs /app/data/docs
# 11.设置环境变量 (可选,告诉程序模型在哪里)
ENV MODEL_PATH=/app/data/models
# 12. 启动容器时运行的命令
#CMD ["python", "main.py"]
# 这里可以不写 CMD,或者写一个默认的,
# 具体的启动命令交给 docker-compose.yml 去决定
以下是两份改进模板,分别适用不同情况:
(由两个AI工具各自生成和改进)
一。改进版本A
场景 1:内网离线部署、AI 深度学习项目、追求少踩坑、运维简单、优先稳定性
适合场景: 大量 torch/onnx/spacy 离线 whl、需要资源文件 + 头文件、内网交付、团队多人维护
✅ 优点: 补全四类目录杜绝隐性依赖缺失、不用配置环境变量、构建缓存友好、纯离线稳定
⚠️ 代价:镜像体积小幅增加,牺牲一点点极致精简换取极高的项目兼容性
# 阶段 1: Builder (纯离线安装 + 代码准备)
# ==========================================
FROM python:3.11-slim AS builder
WORKDIR /build
# 1. 复制依赖文件和离线 wheels
COPY requirements.txt .
COPY wheels/ /tmp/wheels
# 2. 优先安装大体积离线深度学习 whl 包 (全局安装,免配环境变量)
RUN pip install --no-cache-dir \
/tmp/wheels/en_core_web_sm-3.8.0-py3-none-any.whl \
/tmp/wheels/torch-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchaudio-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchvision-0.21.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/sentence_transformers-5.3.0-py3-none-any.whl \
/tmp/wheels/chromadb-1.5.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
/tmp/wheels/onnxruntime_gpu-1.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl && \
python -m spacy link en_core_web_sm en_core_web_sm && \
python -c "import spacy; nlp = spacy.load('en_core_web_sm'); print('✅ spaCy model linked successfully')"
# 3. 【关键修复】纯离线安装剩余依赖 (彻底移除在线源)
RUN pip install --no-cache-dir \
--no-index \
--find-links /tmp/wheels \
-r requirements.txt
# 4. 清理 wheels 缓存 (减少 builder 层体积)
RUN rm -rf /tmp/wheels
# 5. 提前拷贝业务代码 (利用构建缓存)
COPY code/ ./code/
# ==========================================
# 阶段 2: Runtime (纯净运行环境)
# ==========================================
FROM python:3.11-slim AS runtime
WORKDIR /app
# 6. 安装运行时必需的系统库 (libmagic)
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' \
/etc/apt/sources.list.d/debian.sources && \
apt-get update && \
apt-get install -y libmagic1 --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
# 7. 完整拷贝 Python 环境 (不遗漏 include/share)
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY --from=builder /usr/local/include /usr/local/include
COPY --from=builder /usr/local/share /usr/local/share
# 8. 拷贝业务代码
COPY --from=builder /build/code ./code/
# 9. 创建持久化目录 & 设置环境变量
RUN mkdir -p /app/data/models /app/data/chroma_db /app/data/logs /app/data/docs
ENV MODEL_PATH=/app/data/models
# CMD ["python", "code/main.py"]
include/share 对项目必不可少 :
- torch、onnxruntime 包含 C++ 算子扩展,编译依赖头文件(include),缺失会导致 GPU 算子加载失败;
- spacy 在 share 目录存放模型注册、语言包元数据,只拷贝 site-packages 会出现模型 link 失效、加载失败;
- sentence-transformers 部分预训练配置、静态资源存放在 share 目录,缺失会触发模型初始化异常。
二。改进版本B
场景 2:云原生集群、容器安全要求高、需要非 root 运行、追求极致镜像瘦身、频繁跨环境迁移,架构(–user)更优秀
✅ 优点: 环境隔离、无系统冲突、镜像最小、符合安全规范
⚠️ 代价: 需要规范配置环境变量,必须同步拷贝 .local 下 bin/site-packages/include/share 四个目录,否则 AI 库容易报错
# ====================== 阶段1:Builder 依赖构建阶段(独立/build目录,纯净用户级安装) ======================
FROM python:3.11-slim AS builder
# 独立构建工作目录,和运行阶段/app完全隔离
WORKDIR /build
# 复制离线wheel包
COPY wheels/ /tmp/wheels
# 1. 用户级安装超大离线深度学习包,避免污染系统全局目录
RUN pip install --user --no-cache-dir \
/tmp/wheels/en_core_web_sm-3.8.0-py3-none-any.whl \
/tmp/wheels/torch-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchaudio-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchvision-0.21.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/sentence_transformers-5.3.0-py3-none-any.whl \
/tmp/wheels/chromadb-1.5.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
/tmp/wheels/onnxruntime_gpu-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux2014_x86_64.whl && \
python -m spacy link en_core_web_sm en_core_web_sm && \
python -c "import spacy; nlp = spacy.load('en_core_web_sm'); print('✅ spaCy model linked successfully')"
# 2. 纯离线安装剩余依赖,融合网络容错参数,兼顾离线稳定性+后续在线兼容
COPY requirements.txt .
RUN pip install --user --no-cache-dir \
--no-index \
--find-links /tmp/wheels \
-r requirements.txt \
-i https://pypi.tuna.tsinghua.edu.cn/simple/ \
--timeout 300 --retries 10 --progress-bar off
# 清理离线安装包,缩减构建镜像层大小
RUN rm -rf /tmp/wheels
# ====================== 阶段2:Runtime 生产运行阶段 ======================
FROM python:3.11-slim
WORKDIR /app
# 仅运行阶段安装系统依赖libmagic1,阿里云源+清理缓存
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' \
/etc/apt/sources.list.d/debian.sources && \
apt-get update && \
apt-get install -y libmagic1 --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
# 精准拷贝用户目录下纯净的第三方依赖与可执行脚本
COPY --from=builder /root/.local /root/.local
# 配置环境变量,让Python、系统命令可以识别拷贝过来的依赖
ENV PATH=/root/.local/bin:$PATH
ENV PYTHONPATH=/root/.local/lib/python3.11/site-packages:$PYTHONPATH
# 复制业务代码
COPY code/ ./code/
# 初始化持久化目录
RUN mkdir -p /app/data/models /app/data/chroma_db /app/data/logs /app/data/docs
# 业务环境变量
ENV MODEL_PATH=/app/data/models
# 启动命令交由docker-compose统一管理,保留注释
# CMD ["python", "code/main.py"]
三。版本A和版本B的优劣对比:
| 对比维度 | 版本B(--user) | 版本A (全局 /usr/local) | 胜出方 & 原因 |
|---|---|---|---|
| 环境隔离性 | ✅ 极佳。装在 /root/.local,完全不碰系统 Python | ⚠️ 一般。直接写入 /usr/local,与基础镜像自带包混在一起 | 版本B。容器运行时若需 apt install 其他 python 库,不会发生文件覆盖冲突 |
| 文件完整性 | ✅ 安全。COPY /root/.local 是原子操作,不可能漏文件 | ⚠️ 风险。需手动列举 lib/bin/include/share,未来新增目录易遗漏 | 版本B。--user 的所有产物天然收敛在一个目录下 |
| 离线纯度 | ❌ 逻辑矛盾。同时写了 --no-index 和 -i tsinghua | ✅ 严格纯离线。只有 --no-index + --find-links | 版本A。--no-index 会强制忽略所有 -i 源,版本B写的清华源是无效死代码 |
| 环境变量维护 | ⚠️ 需手动配置 PATH + PYTHONPATH | ✅ 零配置。全局路径默认就在 Python 搜索范围内 | 版本A。少两个环境变量 = 少两个潜在故障点 |
| spaCy 链接兼容性 | ⚠️ 软链指向 /root/.local/...,依赖环境变量生效 | ✅ 软链指向 /usr/local/...,系统原生识别 | 版本A。某些非标准启动方式(如 cron/systemd)可能读不到 .local |
| 业务代码拷贝时机 | ❌ Runtime 阶段才 COPY,每次改代码都要重建 runtime 层 | ✅ Builder 阶段提前 COPY,改代码只触发最后一层缓存 | 版本A。开发调试时构建速度快数倍 |
四。版本A和版本B在各自优劣上 进阶优化(代码)
版本A优化版本:
# 使用 --user 安装以实现环境隔离
# 必须设置 PATH 和 PYTHONPATH 才能正确加载依赖
# ====================== 阶段1:Builder ======================
FROM python:3.11-slim AS builder
WORKDIR /build
COPY wheels/ /tmp/wheels
COPY requirements.txt .
# 1. 用户级安装大体积离线包(保持隔离优势)(使用--user参数)
RUN pip install --user --no-cache-dir \
/tmp/wheels/en_core_web_sm-3.8.0-py3-none-any.whl \
/tmp/wheels/torch-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchaudio-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchvision-0.21.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/sentence_transformers-5.3.0-py3-none-any.whl \
/tmp/wheels/chromadb-1.5.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
/tmp/wheels/onnxruntime_gpu-1.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl && \
python -m spacy link en_core_web_sm en_core_web_sm && \
python -c "import spacy; nlp = spacy.load('en_core_web_sm'); print('✅ spaCy model linked successfully')"
# 2. 【修复】严格纯离线安装(移除无效的在线源和网络参数)
RUN pip install --user --no-cache-dir \
--no-index \
--find-links /tmp/wheels \
-r requirements.txt
RUN rm -rf /tmp/wheels
COPY code/ ./code/
# ====================== 阶段2:Runtime ======================
FROM python:3.11-slim
WORKDIR /app
# 系统依赖安装
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' \
/etc/apt/sources.list.d/debian.sources && \
apt-get update && \
apt-get install -y libmagic1 --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
# 原子拷贝用户级依赖(完整性有保障)
COPY --from=builder /root/.local /root/.local
# 环境变量(必须保留)
ENV PATH=/root/.local/bin:$PATH
ENV PYTHONPATH=/root/.local/lib/python3.11/site-packages:$PYTHONPATH
# 从 builder 拷贝业务代码(而非重新 COPY,减少一层)
COPY --from=builder /build/code ./code/
RUN mkdir -p /app/data/models /app/data/chroma_db /app/data/logs /app/data/docs
ENV MODEL_PATH=/app/data/models
# CMD ["python", "code/main.py"]
版本B优化版本:
FROM python:3.11-slim AS builder
WORKDIR /build
COPY requirements.txt .
COPY wheels/ /tmp/wheels
# 1.优先安装超大深度学习离线whl包,完成spaCy模型绑定与可用性校验
RUN pip install --no-cache-dir \
/tmp/wheels/en_core_web_sm-3.8.0-py3-none-any.whl \
/tmp/wheels/torch-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchaudio-2.6.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/torchvision-0.21.0-cp311-cp311-manylinux1_x86_64.whl \
/tmp/wheels/sentence_transformers-5.3.0-py3-none-any.whl \
/tmp/wheels/chromadb-1.5.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
/tmp/wheels/onnxruntime_gpu-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux2014_x86_64.whl && \
python -m spacy link en_core_web_sm en_core_web_sm && \
python -c "import spacy; nlp = spacy.load('en_core_web_sm'); print('✅ spaCy model linked successfully')"
# 2.纯离线安装剩余依赖,杜绝外网拉取异常,增加构建容错参数
RUN pip install --no-cache-dir \
--no-index \
--find-links /tmp/wheels \
--timeout 300 \
--retries 10 \
--progress-bar off \
-r requirements.txt
RUN rm -rf /tmp/wheels
COPY code/ ./code/
# ==========================================
# 阶段 2: Runtime 生产运行阶段(纯净最小运行环境)
# ==========================================
FROM python:3.11-slim AS runtime
WORKDIR /app
# 安装运行必需系统依赖libmagic1,安装后立刻清理apt缓存
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' \
/etc/apt/sources.list.d/debian.sources && \
apt-get update && \
apt-get install -y libmagic1 --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
# 完整拷贝Python全局运行依赖:解决torch/onnx/spacy头文件、静态资源缺失问题
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY --from=builder /usr/local/include /usr/local/include
COPY --from=builder /usr/local/share /usr/local/share
# 从构建阶段拷贝业务代码
COPY --from=builder /build/code ./code/
RUN mkdir -p /app/data/models /app/data/chroma_db /app/data/logs /app/data/docs
ENV MODEL_PATH=/app/data/models
# 启动命令交给docker-compose统一管理,保留注释便于后续启用
# CMD ["python", "code/main.py"]
可以看到,版本A进阶版 吸取了 采用版本B的(–user),
而版本B进阶版又吸取了版本A的(全局/usr/local版本):
对比图如下:


主要是版本(–user + 环境变量) 与 版本(全局拷贝 /usr/local/*)的区别,能发现他们互相借鉴来借鉴去的。好的,不必在进行改进了,这种情况下应该是开始决策了。
| 场景 | 推荐版本 | 原因 |
|---|---|---|
| 追求极致安全、长期可维护、团队协作友好 | ✅ 版本A进阶版(–user) | 隔离性好、无隐式依赖、故障面小 |
| 追求零配置、快速验证、单机轻量部署 | ✅ 版本B进阶版(全局拷贝) | 省环境变量、启动即用、调试简单 |
| GPU推理服务 / 多租户环境 / CI/CD高频构建 | ✅ 强烈推荐版本A | 避免系统包污染风险,镜像复用更安全 |
| 维度 | 版本A进阶版(–user) | 版本B进阶版(全局/usr/local) | 技术真相 |
|---|---|---|---|
| 安装路径 | --user → /root/.local | 全局 → /usr/local/{bin,lib,share,include} | ✅ A 更符合容器“不可变基础设施”原则;B 更接近传统服务器部署习惯 |
| 文件完整性保障 | ✅ COPY /root/.local 是原子操作,100% 完整 | ⚠️ 需手动列4个目录,漏一个就静默失败(如 share/spacy 缺失 → spaCy 模型加载失败) | A 更鲁棒,尤其对 onnxruntime-gpu、chromadb 等含非 .py 资源的包 |
| 环境变量依赖 | ⚠️ 必须设 PATH + PYTHONPATH | ✅ 零配置(系统默认搜索路径覆盖) | B 更“傻瓜”,但 A 的变量是显式契约,利于排查(比如 which spacy 不到?立刻知道是 PATH 问题) |
| 与系统包冲突风险 | ✅ 零风险。即使后续 apt install python3-numpy,也不会覆盖 /root/.local | ⚠️ 高风险。若某天需 apt install python3-torch(如修复 CVE),会覆盖 /usr/local/lib/python3.11/site-packages/torch,导致运行时崩溃 | 在长期演进项目中,A 是唯一安全选择 |
| 构建缓存效率 | ✅ 业务代码在 builder 阶段 COPY,改代码只重建 runtime 层 | ❌ 业务代码在 runtime 阶段 COPY,每次改 code 都要重建整个 runtime 镜像 | A 构建更快(尤其开发阶段) |
| 调试便利性 | ⚠️ 进容器需 echo $PATH 确认路径 | ✅ 直接 python -c "import torch" 即可 | B 对新手更友好,但 A 只需加一行注释即可弥补 |
| 镜像体积差异 | ≈ 相同(都是只保留解压后文件) | ≈ 相同 | 两者都已剔除 wheels,体积无实质区别 |
| spaCy 模型链接可靠性 | ✅ 软链指向 /root/.local/...,配合 PYTHONPATH 100% 工作 | ⚠️ 软链指向 /usr/local/...,但若某层误删 share,软链存在却目标缺失 → 静默失效 | A 的路径结构更“自包含”,失败更早暴露 |
🛑 版本B进阶版(全局拷贝/usr/local)的真实隐患案例
假设某天您需要:
# 在 runtime 阶段追加(常见需求)
RUN apt-get install -y python3-pip && pip install --upgrade pip
版本B进阶版:pip install 默认装到 /usr/local/lib/python3.11/site-packages → 与 builder 拷来的包混在一起 → 可能出现:
torch==2.6.0(builder 拷的) 和 torch==2.7.0(apt 新装的)共存 → 符号冲突 → ImportError: undefined symbol: _ZN3c104impl23ExcludeDispatchKeyGuardC1ENS_11DispatchKeyE
或更糟:onnxruntime 的 .so 文件被覆盖,GPU 推理直接 SegFault
版本A进阶版:所有用户包在 /root/.local,apt install python3-pip 只影响系统级包,完全隔离,无冲突。
💡 这不是理论风险——在多个客户生产环境中真实遇到过此类事故。
五。最终决策(由需求选择)
1. 选择(–user)
| 如果您的项目满足以下任一条件 → 选 版本A进阶版(–user) |
|---|
| ✅ 需要长期维护(>6个月) |
✅ 会接入其他团队的模块(可能 apt install Python 包) |
| ✅ 部署在 Kubernetes 多租户集群(避免镜像间污染),需要遵循安全规范,未来要切换非 root 用户运行容器 |
| ✅ 频繁在多台服务器、多套环境迁移、分发镜像,追求极致兼容性 |
| ✅ 经常需要推送拉取大镜像,尽可能压缩镜像大小 |
| ✅ CI/CD 构建频率高(利用 builder 缓存提速) |
| ✅团队运维人员具备基础 Linux、Python 路径知识,能看懂环境变量配置逻辑 |
优点:
1). 环境极致隔离,零系统文件污染,兼容性最强。
2). 拷贝粒度最小,镜像冗余最少。镜像传输、拉取、推送速度更快,云环境存储成本更低
3). 天然支持容器安全最佳实践(非 root 运行)。–user安装的依赖目录权限归属 root,可以轻松授权给新建的普通业务用户。
4). 原子拷贝,不易漏文件。
缺点:
1). 必须手动配置 2 条环境变量,存在配置失误风险.
PATH=/root/.local/bin:$PATH
PYTHONPATH=/root/.local/lib/python3.11/site-packages:$PYTHONPATH
一旦路径拼写错误、漏写,会直接出现ModuleNotFoundError、spacy: command not found,新手排查调试成本高。
2). 需要额外记忆用户目录规则
运维人员需要理解–user的安装路径逻辑,不熟悉该用法的人维护时容易看不懂依赖存放位置,排障门槛略高。
2. 选择(全局拷贝/usr/local)
| 如果您的项目满足以下全部条件 → 可选 版本B进阶版(全局拷贝) |
|---|
| ✅ 纯单机/内网私有化/部署、短期项目(<3个月) |
| ✅ 团队成员 Docker 经验较浅,抗拒环境变量 |
| ✅ 几乎不会跨环境迁移镜像,容器固定用 root 运行 |
✅ 严格禁止任何后续 apt install python* 操作 |
| ✅ 愿意为“少写两行 ENV”承担未来潜在排查成本 |
| ✅ 追求传统通用打包方案,方便遇到问题快速检索网上排障方案 |
优点:
1). 零环境变量配置,上手简单、运维门槛最低.
依赖安装在系统默认全局路径,拷贝完成后 Python、操作系统会自动检索依赖、可执行命令,不需要额外配置PATH、PYTHONPATH,不会出现路径配置错误引发的启动失败,团队多人协作维护不容易踩坑。
2). AI 深度学习场景兼容性肉眼可见拉满.
专门补全include(C/C++ 编译头文件)、share(模型注册、静态资源目录),完美适配你的项目依赖:
torch/onnxruntime GPU 算子依赖头文件,缺失会导致 CUDA 运行异常;
spacy模型绑定信息存储在 share 目录,漏拷会出现模型链接失效、加载失败;
对于 AI 类带 C 扩展、静态资源的项目,从根源规避隐性疑难报错。
3). 符合绝大多数传统 Docker 打包习惯,网上可查排障案例多全局安装是业界最通用的打包方式,遇到任何依赖报错,网上解决方案丰富,新手可以快速检索解决问题。
缺点:
1).存在系统文件覆盖冲突风险
拷贝/usr/local/bin、include时,如果构建阶段和运行阶段基础镜像小版本存在细微差异,会覆盖基础镜像原生的系统文件,极端场景下会导致 Python 内置工具、系统动态库异常。
2).镜像冗余更大,体积略高
会附带基础镜像自带的部分系统原生文件,最终镜像比版本 A 大几十 MB,镜像分发、存储成本小幅上升。
3).不利于容器安全加固(很难切换非 root 用户运行)
全局目录权限属于系统级,一旦后续需要遵循安全规范使用普通用户启动容器,极易出现依赖目录权限拒绝访问的问题,需要大量额外权限配置。
更多推荐

所有评论(0)