golang本地的开发环境是1.18,结果引用的模块需1.19版本.于是乎升级到最近的版本1.22.结果发现编译的文件在服务器上运行报了下面的错误。
/lib64/libc.so.6: version `GLIBC_2.34' not found
我一般采用docker本地编译,对应环境的文件,然后线上运行。原来的命令是:
docker run -v "$GOPATH":/go -e "GOPROXY=https://proxy.golang.com.cn,direct" --rm -v "$PWD":/go/src/myapp -w /go/src/myapp -e GOOS="linux" -e GOARCH="amd64" golang:1.18 go build -v
# 命令通过挂载当前工作目录和GOPATH到容器内部,使用指定的Go版本进行构建。
# 具体操作包括:
# 1. 挂载GOPATH到容器的/go目录,以便容器可以访问项目的依赖。
# 2. 设置环境变量GOPROXY,使用中国的Go代理服务器,以加速依赖下载。
# 3. 挂载当前工作目录到容器的/go/src/myapp目录,以便容器可以访问应用的源代码。
# 4. 设置容器的工作目录为/go/src/myapp,这样容器内部的构建操作将在应用源代码目录下进行。
# 5. 设置构建目标的操作系统和架构为linux/amd64。
# 6. 使用Go语言版本1.18进行构建。
# 7. 通过-v标志将容器内的构建结果留在主机上。
# 8. 使用--rm标志在容器运行结束后自动删除容器。
后来我将命令修改为下面的方式,添加了 CGO_ENABLED=0 禁用CGO,可以构建出静态链接的二进制文件,便于在多种环境中运行。
docker run -v "$GOPATH":/go \
-e "GOPROXY=https://proxy.golang.com.cn,direct" \
--rm \
-v "$PWD":/go/src/myapp \
-w /go/src/myapp \
-e CGO_ENABLED=0 \
-e GOOS="linux" \
-e GOARCH="amd64" \
golang:1.22 \
go build -v
# 解释:
# -v "$GOPATH":/go:将主机的GOPATH挂载到容器的/go路径,以便使用主机的依赖。
# -e "GOPROXY=https://proxy.golang.com.cn,direct":设置GOPROXY环境变量,使用中国的Go代理以加快下载速度,同时允许直接访问模块。
# --rm:容器运行结束后自动删除容器,避免容器积累。
# -v "$PWD":/go/src/myapp:将当前工作目录挂载到容器的/go/src/myapp路径,以便在容器内构建主机上的项目。
# -w /go/src/myapp:设置容器的工作目录为/go/src/myapp,确保构建命令在正确目录下执行。
# -e CGO_ENABLED=0:禁用CGO,这样可以构建出静态链接的二进制文件,便于在多种环境中运行。
# -e GOOS="linux" -e GOARCH="amd64":设置目标构建平台为Linux amd64,即使主机平台不同。
# golang:1.22:使用Go语言1.22版本的镜像作为构建环境。
# go build -v:在容器内执行构建命令,输出构建过程中的详细信息。
上传后问题解决。
下面的解决方式是claude 3 Opus生成的。
这个错误提示意味着你的系统上安装的 GNU C 库 (glibc) 版本低于程序所需的版本 2.34。
要解决这个问题,你有以下几个选择:
升级系统的 glibc 版本:
在基于 RPM 的系统(如 CentOS、RHEL)上,可以使用以下命令升级 glibc:
sudo yum update glibc
在基于 Debian 的系统(如 Ubuntu)上,可以使用以下命令升级 glibc:
sudo apt-get update
sudo apt-get install libc6
静态链接 glibc:
gcc -static -o program program.c
使用兼容的 glibc 版本:
重新编译程序:
需要注意的是,升级 glibc 可能会影响其他依赖于 glibc 的程序,因此在升级前请仔细评估可能的影响。
参考链接: