Jenkins构建错误: docker: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32'未找到(由docker所需)

8

在进入docker构建阶段时,Jenkins任务失败:

docker build -t jumperiz/nodeapp .

错误信息:

docker: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by docker)
docker: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by docker)

附上我的构建截图,请提供任何指导意见,谢谢!


Jenkins 截图


显示 Jenkins 构建失败的截图并不能真正帮助澄清问题。你的 Jenkins 管道代码中有什么问题?这是管道的问题,还是一个关于在 Jenkins 中正确安装 Docker 的系统管理问题?猜测地说,你是否在容器中运行 Jenkins,并将主机的 Docker 二进制文件绑定到容器中;Docker not found when building docker image using Docker Jenkins container pipeline 可能会有所帮助? - David Maze
是的,我正在容器实例中运行 Jenkins,并将主机上的 Docker 二进制文件挂载到其中。这是我的 Docker 运行命令:docker run -u 0 --privileged --name -it -d -p 8080:8080 -p 50000:50000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker) :/usr/bin/docker \ -v /home/jenkins_home: /var/jenkins_home \ jenkins/jenkins:latest - Sadok Bouzrati
当我执行 docker run -it -u root /bin/bash 命令并登录到容器中,尝试检查 Docker 版本时,结果是 GLIBC_2.32' not found (required by docker) docker: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.34' not found (required by docker)。我的构建图片已附上。 - Sadok Bouzrati
1
-v $(which docker):/usr/bin/docker 这个命令不太可靠。请在您的 Jenkins Dockerfile 中安装 Docker CLI 工具。 - David Maze
1
我遇到了一个问题,容器中的glibc版本是2.31,但我需要将其升级到2.32以满足Docker的要求。请问有什么建议吗? - Sadok Bouzrati
显示剩余2条评论
4个回答

9

您需要手动安装Docker,可以按照以下步骤进行:

  • run jenkins container on detached mode:
    docker run -p 8080:8080 -p 50000:50000 -d -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
    
  • Enter the jenkins container as root user:
    docker exec -it -u0 <container id> bash
    
  • Install docker:
    curl https://get.docker.com > dockerinstall && chmod 777 dockerinstall && ./dockerinstall
    
  • And then exit the Jenkins container and change docker.sock privilege to read and write for all users with:
    sudo chmod 666 /var/run/docker.sock
    

1
我会将这个答案标记为最佳答案。 - Alexandra

3

我也遇到了同样的问题,详细描述可以参考这里

为了将Jenkins容器中的libc版本升级到2.35(与安装在主机上的Ubuntu Jammy一致),我不得不基于此系统(ubuntu:jammy)和JDK 17构建自己的Jenkins容器,使用官方基于Debian的模板(源自这里)。

现在GLIBC版本已经一致,可以在任何安装有Ubuntu Jammy的主机上使用Docker-in-Docker Jenkins构建(但在新的Ubuntu版本中就不行了,比如下一个版本ubuntu:22.10已经有了更高版本的glibc=2.36):

$ ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35

# vs.

$ docker run --rm -it mirekphd/jenkins-jdk17-on-ubuntu2204:latest ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35

欢迎使用此容器,它是由我们内部自动维护的(这是一个由Jenkins制作的Docker-in-Docker管道):


3

我也遇到了同样的问题。

这可能是因为你挂载了宿主机的docker二进制文件,而它依赖于与Jenkins镜像中不同的glibc版本。

为了解决这个问题,我找到了以下两种解决方案:

你可以基于官方模板构建一个自定义的Jenkins镜像,使用ubuntu:jammy代替Debian。但是需要注意的是,这种方法有一些缺点。具体来说,由Jenkins创建的任何兄弟Docker容器也需要拥有glibc 2.35,这意味着你需要使用jammy buildpack-deps修改并构建这些镜像。

另外,你也可以在Dockerfile中安装docker而不是挂载宿主机的docker二进制文件。这将使Jenkins能够使用自己的docker客户端,并仅使用已挂载的docker套接字与docker引擎通信。这种方法通常更好,因为它确保Jenkins使用自己的docker客户端,避免与宿主机的docker二进制文件发生任何依赖冲突。


1
谢谢,我在重建我的Docker镜像时遇到了类似的问题,它获得了新版本的glibc,但是我的/usr/bin/docker是从主机挂载的,而该主机上的glibc版本较旧,因此导致了错误。 - grihabor

1
我通过以下步骤解决了这个问题。
问题:
root@81d156e97b9c:/# docker -v
docker: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by docker)
docker: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by docker)

首先
  • 从Docker文件构建镜像: 这是用于记录的Docker文件内容

FROM jenkins/jenkins:lts
USER root
RUN apt-get update && \
    apt-get -y install apt-transport-https \
         ca-certificates curl gnupg2 \
         software-properties-common && \
    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
    add-apt-repository \
      "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
      $(lsb_release -cs) \
      stable" && \
    apt-get update && \
    apt-get -y install docker-ce
USER jenkins

使用这个命令
docker build -t custom-jenkins-docker:v1 .
在我的情况下,图像大小为1.04Gb(供参考)

然后运行以下命令来创建该图像的容器

docker run -p 8080:8080 -p 50000:50000 -d -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock custom-jenkins-docker:v1

了解容器ID
docker ps

在bash shell中以root用户身份进入exec模式。
docker exec -u 0 -it 557c4a24ff3f bash

现在您可以使用 Docker 命令了

但是如果我想以普通用户身份访问 Docker 呢?

那么我们需要将主机上的 docker.sock 文件权限更改为 666,而不是 660

sudo chmod 666 /var/run/docker.sock

在容器内运行此命令

docker exec -it 557c4a24ff3f bash

现在您可以作为普通用户使用Docker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接