docker: /lib64/libc.so.6: version `GLIBC_2.32‘ not found (required by docker)

博客聚焦Linux环境Ubuntu 22.04下docker-compose.yml配置报错问题。指出jenkins docker特定版本会报错,解决办法是改为jenkins/jenkins:jdk11,原因是报错底层镜像用的centos与Ubuntu 22.04不兼容,还给出了代码示例。

Linux环境 Ubuntu 22.04
docker 最新版
jenkins docker 版本(以下版本都会报错

jenkins/jenkins:centos7
jenkins/jenkins:lts-centos7
jenkins/jenkins:lts

docker-compose.yml配置

version: '3.6'
services:
  gitlab:
    image: twang2218/gitlab-ce-zh
    restart: always
    container_name: gitlab
    hostname: '192.168.2.128'
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.2.128'
        gitlab_rails['time_zone'] = 'Asia/Shanghai'
#         需要配置到 gitlab.rb 中的配置可以在这里配置,每个配置一行,注意缩进。
#         比如下面的电子邮件的配置:
#         gitlab_rails['smtp_enable'] = true
#         gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
#         gitlab_rails['smtp_port'] = 465
#         gitlab_rails['smtp_user_name'] = "xxxx@xx.com"
#         gitlab_rails['smtp_password'] = "password"
#         gitlab_rails['smtp_authentication'] = "login"
#         gitlab_rails['smtp_enable_starttls_auto'] = true
#         gitlab_rails['smtp_tls'] = true
#         gitlab_rails['gitlab_email_from'] = 'xxxx@xx.com'
    ports:
      - '80:80'
      - '443:443'
      - '2222:22'
    volumes:
      - ./gitlab/config:/etc/gitlab
      - ./gitlab/data:/var/opt/gitlab
      - ./gitlab/logs:/var/log/gitlab
    networks:
      - CI/CD
  jenkins:
    image: jenkins/jenkins:lts  #镜像名称
    container_name: jenkins    #指定容器名
    restart: always    #在容器退出时总是重启容器
    user: root    #指定用户
    ports: #容器的端口映射到宿主机上(“:”前数字为宿主机端口,“:”后数字为容器端口)
      - "8080:8080"    #自定义宿主机端口8080
      - "5000:5000"
    environment:
      TZ: Asia/Shanghai    #指定容器运行所属时区
    volumes:
      - ./jenkins/jenkins_home:/var/jenkins_home
      - ./jenkins/home:/home    #将容器的/home目录映射到宿主机上目录中的/data/jenkins/home子目录
      - /etc/localtime:/etc/localtime
      - /var/run/docker.sock:/var/run/docker.sock    #Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程可以通过它与Docker守护进程进行通信。简单来说容器使用宿主机docker命令
      - /usr/libexec/docker/cli-plugins/docker-compose:/usr/local/bin/docker-compose
      - /usr/bin/docker:/usr/bin/docker
#      - /lib/x86_64-linux-gnu/libc.so.6:/lib/x86_64-linux-gnu/libc.so.6
    networks:
      - CI/CD
networks:
  CI/CD:
    driver: bridge

报错信息

18:38:38 $ docker-compose -f /var/jenkins_home/workspace/test-springboot/docker-compose.yml up -d
18:38:38 Building test-java
18:38:38 docker: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by docker)
18:38:38 docker: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by docker)
18:38:38 Service 'test-java' failed to build : Build failed
18:38:38 Build step 'Docker Compose Build Step' changed build result to FAILURE
18:38:38 ERROR: Failed to parse POMs
18:38:38 java.io.EOFException: unexpected stream termination
18:38:38 	at hudson.remoting.ChannelBuilder.negotiate(ChannelBuilder.java:459)
18:38:38 	at hudson.remoting.ChannelBuilder.build(ChannelBuilder.java:404)
18:38:38 	at hudson.slaves.Channels.forProcess(Channels.java:121)
18:38:38 	at hudson.maven.AbstractMavenProcessFactory.newProcess(AbstractMavenProcessFactory.java:298)
18:38:38 	at hudson.maven.ProcessCache.get(ProcessCache.java:237)
18:38:38 	at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:802)
18:38:38 	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:526)
18:38:38 	at hudson.model.Run.execute(Run.java:1895)
18:38:38 	at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543)
18:38:38 	at hudson.model.ResourceController.execute(ResourceController.java:101)
18:38:38 	at hudson.model.Executor.run(Executor.java:442)
18:38:38 Finished: FAILURE

解决方法:

替换 jenkins  docker版本

改为 jenkins/jenkins:jdk11

原因

可能是因为报错的底层镜像用的都是centos,与ubuntu22.04不兼容,
在这里插入图片描述

ubuntu22.04应该使用jenkins/jenkins:jdk11 ,他的From镜像是eclipse-temurin:“${JAVA_VERSION}”-jdk-focal,
在这里插入图片描述

然后在上级的From镜像应该是ubuntu:20.04,所有才能兼容使用
在这里插入图片描述

代码示例

https://gitee.com/xiaoyun461/git-lab-docker.git
### 解决方案:GLIBC_2.32 版本缺失问题 在遇到 `GLIBC_2.32 not found` 问题时,通常是因为系统中的 glibc 版本低于应用程序所需的版本。以下是一些可能的解决方案: #### 方法一:升级 glibc 到更高版本 如果当前系统的 glibc 版本较低,可以通过手动编译安装最新版本的 glibc 来解决此问题。需要注意的是,升级 glibc 可能会影响系统中其他依赖于旧版本 glibc 的程序[^1]。 以下是具体步骤: 1. 下载所需版本的 glibc 源码包(例如 GLIBC 2.32)。 ```bash wget https://ftp.gnu.org/gnu/libc/glibc-2.32.tar.gz ``` 2. 解压并配置编译环境。 ```bash tar -xvf glibc-2.32.tar.gz cd glibc-2.32 mkdir build && cd build ../configure --prefix=/usr ``` 3. 编译并安装。 ```bash make -j$(nproc) sudo make install ``` 完成安装后,可以验证新版本是否生效: ```bash ldd --version ``` #### 方法二:使用 LD_PRELOAD 加载特定版本的 glibc 如果无法直接升级系统中的 glibc,可以尝试通过 `LD_PRELOAD` 环境变量加载特定版本的 glibc。例如,假设已经下载了兼容的 glibc-2.32 并将其解压到 `/opt/glibc-2.32` 目录下,则可以这样运行程序: ```bash export LD_PRELOAD=/opt/glibc-2.32/lib/libc.so.6 ./sophon-app.soc ``` 这种方法不会影响系统的默认 glibc 配置,但需要确保目标程序能够正确识别和加载指定版本的 glibc。 #### 方法三:创建软链接以修复丢失的 libc.so.6 如果系统中已经存在较高版本的 glibc,但未正确链接到 `/lib/aarch64-linux-gnu/libc.so.6`,可以通过创建软链接来解决问题: ```bash sudo ln -sf /path/to/newer/libc.so.6 /lib/aarch64-linux-gnu/libc.so.6 ``` 例如,如果 glibc-2.32 已经安装在 `/opt/glibc-2.32` 中,则可以执行以下命令: ```bash sudo ln -sf /opt/glibc-2.32/lib/libc.so.6 /lib/aarch64-linux-gnu/libc.so.6 ``` #### 方法四:使用容器化技术隔离依赖 对于复杂的依赖问题,推荐使用 Docker 或其他容器化技术来创建一个包含所需 glibc 版本的独立环境。例如,可以基于 Ubuntu 20.04 创建一个容器,并在其中安装 glibc-2.32: ```Dockerfile FROM ubuntu:20.04 RUN apt-get update && \ apt-get install -y software-properties-common && \ add-apt-repository ppa:ubuntu-toolchain-r/test && \ apt-get update && \ apt-get install -y gcc-10 g++-10 && \ apt-get install -y libtinfo5 rsync locales libgtk2.0-0 # 安装 glibc-2.32 RUN wget https://ftp.gnu.org/gnu/libc/glibc-2.32.tar.gz && \ tar -xvf glibc-2.32.tar.gz && \ cd glibc-2.32 && \ mkdir build && cd build && \ ../configure --prefix=/usr && \ make -j$(nproc) && \ make install ``` 构建并运行容器后,可以在其中安全地运行依赖于 glibc-2.32 的程序。 --- ### 注意事项 - 在修改或升级 glibc 之前,请确保备份重要数据,因为错误的操作可能导致系统无法启动。 - 如果目标平台是嵌入式设备(如 ARM 架构),需要特别注意交叉编译环境的设置[^3]。 --- ### 示例代码:检查 glibc 版本 以下是一个简单的 Python 脚本,用于检测当前系统中 glibc 的版本: ```python import ctypes def check_glibc_version(): process = ctypes.CDLL(None) glibc_version = ctypes.c_char_p.in_dll(process, "gnu_get_libc_version").value.decode("utf-8") print(f"Current glibc version: {glibc_version}") check_glibc_version() ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值