大家好,我是testerzhang, 今天分享一个编译的技巧。
由于我的编译机器是CentOS8系统,而我要部署的系统是CentOS7.6,那么当你编译一个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机器进行编译
$ docker pull centos:centos7.9.2009
$ docker exec -it centos7.9 /bin/sh
# yum install -y which# yum install -y wget
# yum install -y gcc*
# 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
[root@16505eab3538 ~]# exit
exit
sh-4.2# exit
exit
# 格式docker commit -m '描述' -a '作者' -p 容器名 镜像名:标签名docker commit -m 'centos7.9 glibc-2.17 go1.7' -a 'testerzhang' -p centos7.9 go1.17:v1.0
将上面的操作写到一个制作Dockerfile文件里
FROM centos:centos7.9.2009SHELL ["/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
上面写完了Dockerfile文件,然后我们执行
docker build --rm -t mygolang1.7 -f ./Dockerfile.dev .
但是有时候命令记不住,那么我们就写一个Makefile文件
VERSION="v1.0.0"
CONTAINER=mygolang1.7docker-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硬盘空间。
自己组建了一个新的交流群,需要进群交流,可以扫描下方加群二维码,也可以在公众号后台回复【加技术群】即可收到相应说明。
喜欢的话可以点击"收藏"进行稍后阅读,可以点击"在看"支持下,也可以分享下此文章给你的其他朋友。
欢迎关注我的公众号“testerzhang”,原创技术文章第一时间推送。
不错,赏个鸡腿!