本教程主要介绍利用Docker编译不同平台的golang二进制文件思路。
1.问题描述
由于我的编译机器是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 go1.17 -f ./Dockerfile.dev .
但是有时候命令记不住,那么我们就写一个Makefile文件(注意:使用Tab键
进行缩进)
VERSION="v1.0.0"
CONTAINER=go1.17
docker-img:
docker build --rm -t $(CONTAINER) -f ./Dockerfile.dev .
然后执行
make docker-img
就可以生成自定义镜像,是不是很方便。
4.后续打包流程
1.有了Go1.17这个基础系统镜像,我们根据这个镜像run出一个容器,同时将本地的项目源码目录挂载过去。
2.编译二进制文件后生成gz压缩包。
3.删除生成的二进制文件。
5.打包项目一个范例
- Dockerfile.dev
FROM go1.17:latest
ENV GOROOT /root/3rd/go
ENV GOPATH /root/go
ENV GOPROXY https://goproxy.cn,direct
ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH
WORKDIR /go/src/gogroup/aliyunpan
ADD . /go/src/gogroup/aliyunpan
SHELL ["/bin/bash", "-c"]
RUN echo $PATH
RUN go version
RUN go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
RUN go get
- Makefile
VERSION="v1.0.0"
CONTAINER=aligin
filename="aligin"
BUILD_TIME = $(shell date +%Y%m%d%H%M%S)
LDFLAGS = -ldflags "-s -w -X $(IMPORT_PATH)/consts.BuildTime=${BUILD_TIME} -X $(IMPORT_PATH)/consts.Version=${VERSION}"
SOURCE_PATH = /go/src/gogroup/aliyunpan
build:
go build $(LDFLAGS) -o $(filename)
release-linux:
docker run --rm -v `pwd`:$(SOURCE_PATH) -t -e GOOS=linux -e GOARCH=amd64 -i $(CONTAINER) go build $(LDFLAGS) -o $(filename)
tar -zcvf $(filename)-$(VERSION)-linux-amd64.tar.gz ./$(filename)
rm $(filename)
clear-img:
docker image rm $(CONTAINER):latest
docker-img:
docker build --rm -t $(CONTAINER) -f ./Dockerfile.dev .
打包过程:
- 只执行一次:
make docker-img
生成项目镜像 - 以后每次修改代码后执行
make release-linux
进行编译打包。
本文没有授权给任何组织、企业和个人转载,未经作者允许禁止转载!
欢迎关注我的公众号testerzhang,原创技术文章第一时间推送。