问题描述
由于我的编译机器是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机器进行编译
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硬盘空间。