Ubuntu22.04下Docker部署Jenkins DinD报GLIBC_2.32/2.34未找到错误
问题根因
该报错由GLIBC版本不匹配直接导致:
- compose配置中直接将宿主机Ubuntu 22.04的
/usr/bin/docker二进制文件挂载进Jenkins容器 - 宿主机上的docker二进制针对GLIBC 2.35版本动态编译,运行时依赖GLIBC 2.32、2.34版本提供的符号
- 使用的
jenkins/jenkins:lts-jdk17镜像底层为Debian 11,内置GLIBC版本仅为2.31,无法满足该二进制的依赖要求 - 更换不同JDK版本、alpine版本的Jenkins镜像无法解决问题:这类镜像的基础系统GLIBC版本均低于2.34,alpine镜像甚至使用musl libc而非glibc,依赖兼容性更差。
可行解决方案
方案1(推荐):在Jenkins镜像中内置匹配系统版本的Docker CLI
当前架构是用独立的dind容器运行Docker守护进程,Jenkins容器只需要Docker CLI客户端通过tcp://docker-in-docker-container:2375连接守护进程即可,完全不需要挂载宿主机的docker二进制。
- 首先删除原有compose配置中Jenkins服务下的错误挂载项:
- /usr/bin/docker:/usr/bin/docker - 新建自定义Jenkins镜像的Dockerfile,在Jenkins基础镜像中安装对应Debian系统版本的Docker CLI:
FROM jenkins/jenkins:lts-jdk17 USER root # 安装Docker CE CLI RUN apt-get update && apt-get install -y ca-certificates curl gnupg && \ install -m 0755 -d /etc/apt/keyrings && \ curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ chmod a+r /etc/apt/keyrings/docker.gpg && \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ apt-get update && apt-get install -y docker-ce-cli && \ rm -rf /var/lib/apt/lists/* USER jenkins
- 修改docker-compose.yaml,使用自定义构建的镜像,同时修正dind容器的存储挂载配置(避免dind运行数据和Jenkins数据混放引发权限问题),修正后的配置参考:
version: '3.3' services: docker-in-docker-container: image: docker:dind container_name: docker-in-docker-container user: root privileged: true expose: - 2375 volumes: - dind-storage:/var/lib/docker environment: DOCKER_TLS_CERTDIR: "" restart: on-failure jenkins-container: build: ./jenkins # 此处路径替换为存放上述Dockerfile的目录路径 container_name: jenkins-container user: root depends_on: - docker-in-docker-container ports: - '8080:8080' volumes: - ./data:/var/jenkins_home environment: DOCKER_HOST: tcp://docker-in-docker-container:2375 restart: on-failure volumes: dind-storage:
- 执行
docker-compose up -d --build重新构建并启动容器,进入Jenkins容器执行docker version,若能正常返回Client和Server(dind服务端)的版本信息,即配置修复完成,后续执行docker相关命令不会再出现GLIBC报错。
方案2(临时测试用):挂载dind容器内的Docker CLI
如果不想自定义构建镜像,可以直接将dind容器内的docker二进制挂载到Jenkins容器中,dind镜像内的CLI是和自身依赖库匹配的,可以直接连接dind守护进程。修改compose中Jenkins服务的volumes配置,删除原有宿主机docker挂载项后启动容器,执行以下命令将dind容器内的docker二进制复制到Jenkins数据目录:
docker cp docker-in-docker-container:/usr/local/bin/docker ./data/docker
再在Jenkins服务的volumes中增加挂载项- ./data/docker:/usr/bin/docker,重启容器即可。该方法稳定性弱于方案1,dind镜像升级后可能出现CLI和服务端版本差过大的问题。
注意事项
不要跨不同GLIBC版本的发行版直接挂载动态编译的二进制文件,这类操作必然会引发动态链接库依赖缺失的问题。如果需要在容器内使用某个命令,优先通过包管理器在容器内安装对应系统版本的编译包。
内容的提问来源于stack exchange,提问作者Izhar Hussain
相关产品推荐
相关产品推荐

