news 2026/3/24 0:53:43

dockerfile多阶段构建 + UBI 9(在指定的根目录中卸载 setup 包`rpm --root /mnt/rootfs -e --nodeps setup`)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dockerfile多阶段构建 + UBI 9(在指定的根目录中卸载 setup 包`rpm --root /mnt/rootfs -e --nodeps setup`)

文章目录

    • 在指定的根目录中卸载 setup 包
      • 为什么要删除 setup 包?
    • 使用场景举例
      • 什么是 UBI 9
      • dockerfile多阶段构建 + UBI 9

在指定的根目录中卸载 setup 包

rpm--root /mnt/rootfs -e --nodeps setup

这条命令的作用是在指定的根目录中卸载 setup 包,并忽略依赖关系检查。

  • –root 参数:在挂载的文件系统中进行操作,而不影响宿主系统
  • -e 参数:删除已安装的包
  • –nodeps 参数:跳过依赖性检查(危险操作,可能破坏系统)这是一条高风险命令,仅在其他方法都失败的情况下使用,且操作前务必备份重要数据。

为什么要删除 setup 包?

方面说明
setup 包的作用提供基础系统配置文件(/etc/passwd,/etc/group,/etc/profile等)
为什么删除在容器镜像中不需要系统初始化脚本,这些文件占用空间且无用
–nodeps 的意义跳过依赖检查,因为其他包可能依赖 setup,但在最小化镜像中不关心
镜像优化删除不必要的包,使镜像尽可能小

使用场景举例

什么是 UBI 9

UBI 是 Universal Base Image,Red Hat 官方提供的容器基础镜像。让我详细解释。

UBI 9 = Universal Base Image 9 ↓ 基于 RHEL 9(Red Hat Enterprise Linux 9)

包含:
✅ glibc(标准 C 库)
✅ SSL/TLS 证书
✅ 时区数据库
✅ 本地化文件

# 标准版(包含包管理器)FROM registry.redhat.io/ubi9/ubi:latest# 最小化版(推荐用于多阶段构建)FROM registry.redhat.io/ubi9/ubi-minimal:latest# 超最小化版(极度简化)FROM registry.redhat.io/ubi9/ubi-micro:latest
版本大小包管理器场景
ubi:latest70-80 MBdnf + rpm开发、需要灵活性
ubi-minimal40-50 MBmicrodnf(轻量版)生产、多阶段构建
ubi-micro20-30 MB无包管理器超轻量、只有运行时

dockerfile多阶段构建 + UBI 9

# 第一阶段:使用标准 UBI 9 构建 FROM registry.redhat.io/ubi9/ubi:latest AS builder # 在这里可以自由安装任何包 RUN dnf install -y \ curl \ nginx \ openssl \ ca-certificates # 准备文件 RUN mkdir -p /mnt/rootfs && \ dnf install --installroot /mnt/rootfs \ curl nginx \ --releasever 9 \ --setopt install_weak_deps=false \ --nodocs -y && \ dnf --installroot /mnt/rootfs clean all && \ rpm --root /mnt/rootfs -e --nodeps setup # 第二阶段:使用最小化 UBI 9 运行 FROM registry.redhat.io/ubi9/ubi-minimal:latest # 只复制必需文件,“只复制必需文件”容易出问题,尤其是库路径、符号链接、权限和特殊文件(device、管道、selinux 标签)会丢失或错位 COPY --from=builder /mnt/rootfs/usr/bin/curl /usr/bin/curl COPY --from=builder /mnt/rootfs/usr/sbin/nginx /usr/sbin/nginx COPY --from=builder /mnt/rootfs/usr/lib64/ /usr/lib64/ COPY --from=builder /mnt/rootfs/etc/nginx/ /etc/nginx/ CMD ["/usr/sbin/nginx","-g","daemon off;"]

注意:
“只复制必需文件”确实容易出问题,尤其是库路径、符号链接、权限和特殊文件(device、管道、selinux 标签)会丢失或错位。

应该改成:

COPY --from=builder /mnt/rootfs /

/mnt/rootfs 中的所有内容都被递归复制到目标 / 中

  • 如果目标已有同名文件,则覆盖
  • 如果目标没有该文件,则新增

但是这种方式,也会存在潜在的风险(残留 rpm/dnf 元数据可能误导后续运维;重复或不一致的库导致难排查、覆盖系统配置:/etc 中的配置;符号链接与版本冲突:不同版本的 .so 文件与链接可能破坏依赖解析 等),

我们需要做到以下几点:

  1. 构建时候需要rpm --root /mnt/rootfs -e --nodeps setup
    删除 setup 包
  2. 在指定的安装根目录下清理 DNF 缓存和元数据dnf --installroot /mnt/rootfs clean all
  3. 优先在运行时使用与 builder 相同的基镜像

尤其3,我觉得最重要,尤其你使用COPY --from=builder /mnt/rootfs /这种覆盖方式!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 6:10:01

python django flask鹿幸公司员工食堂在线点餐餐饮餐桌预约管理系统的设计与实现_utcnqqs0--论文

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统截图 python django flask鹿幸公司员工食堂在线点餐餐饮餐桌预约管理系统的设计与实现_utcnqqs0–论文 …

作者头像 李华
网站建设 2026/3/23 14:44:48

性价比高的老房换新实用门窗品牌精选指南排名

性价比高的老房换新实用门窗品牌精选指南排名在老房换新的过程中,门窗的更换是至关重要的一环。选择一款性价比高的门窗,不仅能提升居住的舒适度,还能为家居增添美观。以下为大家带来一份实用的门窗品牌精选指南。工厂直营模式:性…

作者头像 李华
网站建设 2026/3/15 17:52:48

好用做老房换新实用门窗品牌精选指南的机构

做老房换新实用门窗的品牌精选指南引言老房换新门窗是提升居住品质的重要工程,然而面对众多的门窗品牌,消费者往往不知如何选择。在众多选择中,工厂直营模式的品牌有着独特的优势。专业评估能力像采用工厂直营模式的这类品牌,具备…

作者头像 李华
网站建设 2026/3/23 2:13:27

灵活用工平台,我的实践复盘

灵活用工平台技术实践复盘:从行业挑战到解决方案的演进行业痛点分析当前,灵活用工平台领域正面临一系列深刻的技术挑战,这些挑战直接关系到平台的稳定性、合规性及用户体验。首要挑战在于海量并发处理与数据精准性。随着灵活用工模式渗透率的…

作者头像 李华
网站建设 2026/3/15 14:34:30

在duckdb 递归CTE中实现深度优先搜索DFS

原帖地址 https://github.com/duckdb/duckdb/discussions/15386 通常的递归CTE都是广度优先搜索(BFS) WITH RECURSIVE edges(a, b) as( VALUES(1, 2),(1, 3),(2, 4),(4, 5),(4, 6) ), bfs(node, path) AS (SELECT 1 AS node, [] :: STRUCT("from&…

作者头像 李华
网站建设 2026/3/22 21:13:28

基于记忆增强网络的语言模型推理优化

基于记忆增强网络的语言模型推理优化 关键词:记忆增强网络、语言模型、推理优化、注意力机制、深度学习 摘要:本文聚焦于基于记忆增强网络的语言模型推理优化。首先介绍了相关背景,包括研究目的、预期读者、文档结构和术语定义。接着阐述了核心概念,如记忆增强网络和语言模…

作者头像 李华