golang编译遇到glibc问题,可以这样解决!

2023年 7月 11日 49.9k 0

问题描述

由于我的编译机器是CentOS8系统,而我要部署的系统是CentOS7.6,那么当你编译一个golang二进制文件的时候,你会因为glibc的不同导致在低系统版本运行不起来。

golang编译遇到glibc问题,可以这样解决!

报错现象:

‘GLIBC_2.28’ not found

因为Centos7.6默认是glibc-2.17

$  rpm -qa|grep glibc
glibc-devel-2.17-307.el7.1.x86_64
glibc-common-2.17-307.el7.1.x86_64
glibc-headers-2.17-307.el7.1.x86_64
glibc-2.17-307.el7.1.x86_64

难道我要搞一台CentOS7的机器来编译?有没有其他办法?

答案是Docker 构造一个CentOS7机器进行编译

2.制作一个CentOS7-golang1.7镜像

2.1 原始步骤

2.1.1 拉取基础镜像

 $ docker pull centos:centos7.9.2009

2.1.2 根据镜像生成容器

 $ docker exec -it centos7.9  /bin/sh

2.1.3 容器操作

2.1.3.1 安装基础信息

# yum install -y which

# yum install -y wget

# yum install -y gcc*

2.1.3.2 安装go环境

# mkdir ~/go

# mkdir ~/3rd

# cd ~/3rd/

# wget https://mirrors.ustc.edu.cn/golang/go1.17.13.linux-amd64.tar.gz

# rm -rf go1.17.13.linux-amd64.tar.gz

# yum clean all

2.1.3.3 退出容器

[root@16505eab3538 ~]# exit
exit
sh-4.2# exit
exit

2.1.4 容器打包为基础镜像

# 格式docker commit -m '描述' -a '作者' -p 容器名 镜像名:标签名

docker commit -m 'centos7.9 glibc-2.17 go1.7' -a 'testerzhang' -p centos7.9 go1.17:v1.0

3.傻瓜式的方式

3.1 制作Dockerfile.dev

将上面的操作写到一个制作Dockerfile文件里

FROM centos:centos7.9.2009

SHELL ["/bin/bash", "-c"]
RUN echo $PATH

RUN yum install -y which wget gcc* && mkdir -p ~/go && mkdir -p ~/3rd && cd  ~/3rd && wget https://mirrors.ustc.edu.cn/golang/go1.17.13.linux-amd64.tar.gz && tar zxf go1.17.13.linux-amd64.tar.gz && rm -rf go1.17.13.linux-amd64.tar.gz && yum clean all

3.2 写一个Makefile来快捷编译

上面写完了Dockerfile文件,然后我们执行

docker build --rm -t mygolang1.7 -f ./Dockerfile.dev .

但是有时候命令记不住,那么我们就写一个Makefile文件

VERSION="v1.0.0"
CONTAINER=mygolang1.7

docker-img:
    docker build --rm -t $(CONTAINER) -f ./Dockerfile.dev .

然后执行

make docker-img

就可以生成自定义镜像,是不是很方便。

后续流程

1.有了Go1.17这个基础系统镜像,我们根据这个镜像run出一个容器,同时将本地的项目源码目录挂载过去。

2.编译二进制文件后生成gz压缩包。

3.删除生成的二进制文件。

文末

为啥没使用alpine制作镜像?

主要是已有的一些镜像glibc版本还是太高,或者是没依赖glibc编译部署后缺少musl依赖。为了保证系统一致性,减少不必要的麻烦,还是选择了CentOS系统来做基础镜像,缺点就是镜像占用1G硬盘空间。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论