制作go1.17镜像编译代码

制作go1.17镜像编译代码

本教程主要介绍利用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,原创技术文章第一时间推送。

公众号二维码

updatedupdated2023-04-102023-04-10