0

0

如何在单阶段 Docker 构建中安全彻底卸载 pip

花韻仙語

花韻仙語

发布时间:2026-02-15 11:24:09

|

906人浏览过

|

来源于php中文网

原创

如何在单阶段 Docker 构建中安全彻底卸载 pip

本文详解在基于非 root 用户的定制 python 基础镜像中,通过切换用户权限、调用模块化卸载命令及清理残留文件三步法,彻底移除 pip,规避 permissionerror 并满足安全合规要求。

本文详解在基于非 root 用户的定制 python 基础镜像中,通过切换用户权限、调用模块化卸载命令及清理残留文件三步法,彻底移除 pip,规避 permissionerror 并满足安全合规要求。

在构建生产级 Python API 的单阶段 Docker 镜像时,出于安全审计(如 CVE-2023-47248 等 pip 相关漏洞)和最小化攻击面的要求,许多团队需在最终镜像中完全移除 pip。然而,当使用企业内部定制的 Python 基础镜像(如 python:3.10 衍生版)时,镜像通常默认以非 root 用户(如 nonroot)运行,直接执行 python3 -m pip uninstall pip -y 会因权限不足而失败:

PermissionError: [Errno 13] Permission denied: '/usr/bin/pip' -> '/tmp/pip-uninstall-.../pip'

该错误本质是:pip uninstall pip 在执行时尝试重命名系统级二进制文件(如 /usr/bin/pip),而当前用户无权写入 /usr/bin/ 目录。

DeepL
DeepL

DeepL是一款强大的在线AI翻译工具,可以翻译31种不同语言的文本,并可以处理PDF、Word、PowerPoint等文档文件

下载

✅ 正确卸载方案:三步原子化清理

为确保可靠、可复现且符合最小权限原则,推荐采用以下结构化流程:

  1. 临时切换至 root 用户 —— 获取必要权限执行卸载;
  2. 以模块方式卸载 pip —— 避免依赖 shell 脚本路径,更健壮;
  3. 主动清理残留文件与用户级安装项 —— 彻底消除所有 pip 痕迹。

✅ 推荐 Dockerfile 片段(兼容企业镜像)

FROM artifactory.sdlc.ctl.gcp.db.com/dkr-public-local/gcp-community-images/python:3.10

ARG ENV_VAR
ENV APP_ENV=$ENV_VAR
WORKDIR /app

# 设置代理(按需保留)
ENV http_proxy=http://sp-surf-proxy.intranet.db.com:8080
ENV https_proxy=http://sp-surf-proxy.intranet.db.com:8080
ENV no_proxy=.googleapis.com,metadata.google.internal,status.cloud.google.com

COPY requirements.txt .
RUN pip install -r requirements.txt \
    --no-cache-dir \
    --disable-pip-version-check \
    --user  # 安装到 $HOME/.local,避免污染系统路径

# ? 关键:切换 root 执行卸载
USER root

# 使用 python -m pip 卸载 pip(安全、跨平台、不依赖 PATH)
RUN python3 -m pip uninstall pip -y

# 清理系统级 pip 二进制(/usr/bin/pip*)及符号链接
RUN rm -f /usr/bin/pip* /usr/local/bin/pip*

# ? 切回非 root 用户(遵循最小权限原则)
USER nonroot

# 清理用户级 pip(如 --user 安装产生的 ~/.local/bin/pip*)
RUN rm -rf /home/nonroot/.local/bin/pip*

# 继续构建流程
COPY . .
RUN ls -l /app
RUN python3 --version

CMD ["python3", "/app/src/app.py"]

⚠️ 注意事项与最佳实践

  • 不要使用 apt-get remove python3-pip:该命令仅适用于 Debian/Ubuntu 基础镜像,且可能破坏 python3 包依赖;Python 官方及多数企业镜像中 pip 是通过 ensurepip 模块内置的,应优先使用 python -m pip uninstall。
  • *--user 安装后务必清理 `~/.local/bin/pip`**:否则即使卸载了系统 pip,用户目录下仍残留可执行文件,违反“完全移除”目标。
  • 验证是否成功:可在构建末尾添加验证步骤:
    RUN ! command -v pip && ! python3 -c "import pip" 2>/dev/null || (echo "ERROR: pip still present!" && exit 1)
  • 镜像体积优化:卸载 pip 后,可进一步运行 RUN apt-get clean && rm -rf /var/lib/apt/lists/*(Debian 系)或 RUN yum clean all(RHEL 系)清理包管理缓存(如基础镜像包含包管理器)。

✅ 总结

彻底卸载 pip 不是简单删除二进制文件,而是需协同处理模块注册、系统路径、用户路径三层残留。核心在于:以 root 权限调用 python -m pip uninstall pip 主动解除模块注册,再辅以精准的文件清理。该方法兼容所有基于 CPython 的官方及定制镜像,稳定、安全、可审计,是满足 CIS Docker Benchmark 与企业安全策略的推荐实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

348

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

425

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

784

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

356

2025.07.23

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

265

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

512

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

409

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.04.08

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
光速学会docker容器
光速学会docker容器

共33课时 | 2万人学习

Docker 17 中文开发手册
Docker 17 中文开发手册

共0课时 | 0人学习

极客学院Docker视频教程
极客学院Docker视频教程

共33课时 | 18万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号