You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决CI/CD环境中microdnf因glib错误执行失败的问题?

如何解决CI/CD环境中microdnf因glib错误执行失败的问题?

嘿,这个问题我之前也碰到过类似的情况,结合你描述的环境差异(RHEL7.9+Docker19.x vs CentOS7+Docker20.x),核心原因确实是旧版本Docker(19.x)和UBI9-minimal镜像的兼容性问题——UBI9基于RHEL9,它的glib等组件对容器运行时的隔离特性、系统调用支持有更高要求,而Docker19.x对这些新需求的支持不够完善,才会触发pthread_create权限错误。

给你几个可行的解决思路,按优先级排序:

1. 优先升级CI/CD机器的Docker版本到20.x及以上

这是最彻底的解决方案,你已经在Docker20.x的环境验证过可行,说明新版本Docker修复了和UBI9相关的兼容性问题。Red Hat官方也推荐使用Docker 20.10+来搭配UBI9镜像,升级后不仅能解决这个线程创建的问题,还能获得更好的性能和安全性。

升级步骤参考:

  • 先卸载旧版本Docker:sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  • 添加适配RHEL7的Docker官方yum源
  • 安装指定版本的Docker:sudo yum install docker-ce-20.10.* docker-ce-cli-20.10.* containerd.io
  • 重启Docker服务:sudo systemctl restart docker

2. 临时调整Docker的seccomp安全配置(不推荐长期使用)

如果暂时没法升级Docker,可以尝试放宽容器的seccomp限制,因为默认的seccomp profile在Docker19.x中可能阻止了UBI9需要的某些系统调用。

你可以先在构建命令中添加参数测试:

docker build --security-opt seccomp=unconfined .

如果构建成功,说明是seccomp规则的问题。若要让CI/CD环境默认生效,可以修改Docker daemon配置文件/etc/docker/daemon.json,添加:

{
  "seccomp-profile": "unconfined"
}

然后重启Docker。不过要注意,关闭seccomp会降低容器的安全性,只适合临时过渡使用。

3. 替换基础镜像为UBI8-minimal

如果升级Docker和调整seccomp都有困难,可以考虑把Dockerfile里的基础镜像换成redhat/ubi8-minimal——UBI8对旧版Docker和RHEL7.9的3.10内核兼容性更好,你同样可以用microdnf install yum命令,不会触发glib的错误。不过这个方案需要调整你的镜像依赖,可能要测试后续部署流程是否受影响。

4. 检查并调整主机的SELinux或内核参数

有时候RHEL7.9的SELinux会限制容器内的线程创建操作,你可以临时关闭SELinux测试:

sudo setenforce 0

如果构建成功了,再考虑调整SELinux的策略规则,而非长期关闭。另外,也可以检查主机内核是否开启了user_namespace等必要特性,但这个操作相对复杂,优先级不如前面几个方案。

备注:内容来源于stack exchange,提问作者deostroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:09:36