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

2023-04-1910:01:13编程语言入门到精通Comments2,922 views字数 1784阅读模式

问题描述

由于我的编译机器是CentOS8系统,而我要部署的系统是CentOS7.6,那么当你编译一个golang二进制文件的时候,你会因为glibc的不同导致在低系统版本运行不起来。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

golang编译遇到glibc问题,可以这样解决!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

报错现象:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

‘GLIBC_2.28’ not found

因为Centos7.6默认是glibc-2.17文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

$  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的机器来编译?有没有其他办法?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

答案是Docker 构造一个CentOS7机器进行编译文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

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文件里文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

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文件,然后我们执行文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

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

但是有时候命令记不住,那么我们就写一个Makefile文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

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

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

然后执行文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

make docker-img

就可以生成自定义镜像,是不是很方便。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

后续流程

1.有了Go1.17这个基础系统镜像,我们根据这个镜像run出一个容器,同时将本地的项目源码目录挂载过去。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

2.编译二进制文件后生成gz压缩包。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

3.删除生成的二进制文件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

文末

为啥没使用alpine制作镜像?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

主要是已有的一些镜像glibc版本还是太高,或者是没依赖glibc编译部署后缺少musl依赖。为了保证系统一致性,减少不必要的麻烦,还是选择了CentOS系统来做基础镜像,缺点就是镜像占用1G硬盘空间。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/35799.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/35799.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定