CentOS 8 系统下的包依赖冲突问题

Docker CE Stable - x86_64 94 kB/s | 66 kB 00:00

错误:

问题: 安装的软件包的问题 buildah-1.19.7-1.module_el8.4.0+781+acf4c33b.x86_64


今天给自己的小玩意安装docker的时候遇到报错

通过报错我们可知,遇到的是 CentOS 8 系统下的包依赖冲突问题,核心原因很明确:

  1. 系统预装了 buildah(一款容器构建工具),它依赖 系统自带的 runc 包(版本要求 ≥1.0.0-26);
  2. Docker 的 containerd.io 包会自带并替换系统原生的 runc (为了保证 Docker 运行的一致性),这就和 buildah 的依赖要求产生了冲突;
  3. 同时系统开启了「模块化过滤」,部分兼容的 runc 包被屏蔽,无法满足依赖要求。

下面提供 3 种解决方案,按「操作简单度」从高到低排序,优先推荐第一种(最快捷,不影响核心功能)。

方案一:直接允许替换冲突包(推荐,一步到位)

yum/dnf 提供了 --allowerasing 参数,专门用于解决这类「冲突包替换」问题,它会自动卸载冲突的旧包(系统自带的 runc、不兼容的 buildah 相关组件),同时安装 Docker 所需的包,完全满足你的需求。

操作命令(指定安装 Docker 20.10.0,避免最新版冲突)

bash 复制代码
# 安装指定版本 Docker 20.10.0,允许替换冲突包
yum install -y --allowerasing docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io

说明

  • 这个命令会自动卸载「与 containerd.io 冲突的系统 runc」和「依赖该 runc 的 buildah」;
  • buildah 是 CentOS 8 默认预装的容器工具,和 Docker 功能重叠,卸载后不影响系统核心运行,也不影响 Docker 的使用;
  • 执行完成后,直接继续后续的 Docker 启动、配置步骤即可。

方案二:先卸载冲突包,再安装 Docker(稳妥,手动清理)

如果不想让系统自动替换包,可以先手动卸载冲突的 buildah 和系统原生 runc,再安装 Docker,步骤更清晰,适合对系统包有严格控制的场景。

操作步骤

卸载冲突包

bash 复制代码
# 卸载 buildah 及其依赖的冲突包
yum remove -y buildah runc

安装指定版本 Docker 20.10.0

bash 复制代码
# 此时无冲突,直接安装即可
yum install -y docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io

方案三:禁用模块化过滤(进阶,保留系统原生包)

如果需要保留 buildah 和系统原生 runc,可以禁用 CentOS 8 的「模块化过滤」,让系统显示被屏蔽的 runc 包,从而满足依赖要求。这个方案操作稍复杂,适合需要同时使用 buildah 和 Docker 的场景。

操作步骤

  1. 禁用模块化过滤(临时生效,测试用)

    bash 复制代码
    yum module disable -y container-tools
  2. 更新 yum 缓存

    bash 复制代码
    yum clean all && yum makecache fast
  3. 安装 Docker(此时会自动匹配兼容的 runc 包)

    bash 复制代码
    yum install -y docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io
  4. (可选)永久禁用模块化过滤

    bash 复制代码
    # 编辑yum配置文件,添加模块化过滤禁用参数
    echo "module_hotfixes=1" >> /etc/yum.conf

后续验证步骤(无论哪种方案,安装后都要执行)

运行

bash 复制代码
# 1. 启动Docker并设置开机自启
systemctl enable docker --now

# 2. 验证Docker版本是否正确(20.10.0)
docker --version

# 3. 验证Docker是否正常运行(拉取一个测试镜像)
docker pull hello-world

# 4. 运行测试容器,确认无报错
docker run hello-world

关键注意事项

  1. 优先选择「方案一」,--allowerasing 是 yum/dnf 解决这类冲突的官方推荐方案,操作最简单、成功率最高;

  2. 指定 Docker 安装,避免安装最新版 Docker 带来新的依赖冲突(最新版 containerd.io 对 runc 的版本要求更高,冲突概率更大)或者安装ce版本也成;

  3. 卸载 buildah 不会影响系统其他功能,它只是一个可选的容器构建工具,和 Docker 功能重叠,无需担心系统稳定性;

  4. 若执行命令后仍有报错,可尝试添加 --nobest 参数(跳过「最佳候选包」限制),完整命令:

    bash 复制代码
    yum install -y --allowerasing --nobest docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io

总结

  1. 核心问题:buildah 依赖系统 runc,与 Docker 的 containerd.io 自带 runc 冲突;
  2. 最优解:使用 --allowerasing 参数一键替换冲突包,快速安装指定版本 Docker 20.10.0;
  3. 验证关键:安装后通过 docker --version 和 docker run hello-world 确认 Docker 正常运行;
  4. 避坑点:指定 Docker 版本安装,避免最新版带来额外依赖冲突。

END

如果觉得这份基础知识点总结清晰,别忘了动动小手点个赞👍,再关注一下呀~ 后续还会分享更多有关开发问题的干货技巧,同时一起解锁更多好用的功能,少踩坑多提效!🥰 你的支持就是我更新的最大动力,咱们下次分享再见呀~🌟

相关推荐
阳光九叶草LXGZXJ2 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊2 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
黄大刀3 小时前
DataPulse一款开箱即用的SCADA(四)-历史记录
运维·scada·动环
归秋1425 小时前
2026 企业 AI 办公工具选型指南:从评估框架到产品适配
大数据·运维·人工智能
Android系统攻城狮5 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛6 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德6 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札7 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨8 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业8 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie