如何在Ubuntu 20上构建兼容Ubuntu 18的GLIBC_2.27版Go应用?
解决Go应用在Ubuntu 18.04上的GLIBC版本兼容问题
这个坑我之前部署Go服务到旧Ubuntu服务器时踩过好几次,直接升级服务器的GLIBC确实风险极大——搞不好会导致系统依赖的很多基础命令(比如ls、cp)直接失效,完全不推荐。下面给你几个靠谱的、基于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




