You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Ubuntu 20上构建兼容Ubuntu 18的GLIBC_2.27版Go应用?

解决Go应用在Ubuntu 18.04上的GLIBC版本兼容问题

这个坑我之前部署Go服务到旧Ubuntu服务器时踩过好几次,直接升级服务器的GLIBC确实风险极大——搞不好会导致系统依赖的很多基础命令(比如lscp)直接失效,完全不推荐。下面给你几个靠谱的、基于GLIBC 2.27构建兼容二进制的方案,按推荐优先级排序:

1. 优先尝试静态编译(最简单)

如果你的Go代码没有调用任何C语言依赖(也就是没用到CGO),直接用静态编译就能生成不依赖系统GLIBC的二进制,一步解决问题:

CGO_ENABLED=0 go build -o myApp .

编译出来的myApp是完全静态的,能直接在Ubuntu 18.04甚至更旧的系统上运行。你可以用ldd ./myApp命令验证,如果输出not a dynamic executable就说明静态编译成功了。

2. 用Ubuntu 18.04容器构建(最稳妥,适合有CGO依赖的情况)

如果你的代码必须用到CGO(比如调用了第三方C库),静态编译走不通,那用容器构建是最安全的方式——容器里的环境就是Ubuntu 18.04,自带GLIBC 2.27,编译出来的二进制天然兼容:

  • 先拉取Ubuntu 18.04镜像:
    docker pull ubuntu:18.04
    
  • 把你的Go代码目录挂载到容器里并进入交互模式(假设代码在本地./my-go-project目录):
    docker run -v ./my-go-project:/app -it ubuntu:18.04 /bin/bash
    
  • 在容器内安装Go环境(这里以Go 1.21.10为例,选支持Ubuntu 18.04的版本):
    apt update && apt install -y wget
    wget https://dl.google.com/go/go1.21.10.linux-amd64.tar.gz
    tar -C /usr/local -xzf go1.21.10.linux-amd64.tar.gz
    export PATH=$PATH:/usr/local/go/bin
    
  • 进入代码目录执行构建:
    cd /app
    go build -o myApp .
    
  • 退出容器后,本地./my-go-project目录里的myApp就是兼容Ubuntu 18.04的版本了。

3. 直接在Ubuntu 18.04环境中构建

如果你有条件,可以直接在Ubuntu 18.04的物理机、虚拟机或者云实例上搭建Go环境,然后直接编译代码。这种方式和容器构建的效果一致,只是需要单独维护一个旧版本的系统环境。


内容的提问来源于stack exchange,提问作者Morteza Taghizadeh

火山引擎 最新活动