alpine linux安装升级golang

最近由于需要采用Jenkinsfile来进行golang的CI/CD流程,突然发现原来公司的Jenkins服务器上并没有安装golang的编译环境,由于之前采用docker建立的的jenkins基本文件,而这个容器是基于Alpine Linux的实现,众所周知,Alpine Linux由于体积的优势,在容器领域运用很多,但是带来的问题也非常多。

首先Alpine Linux下的libc是musl的实现,shell也是busybox的实现,包管理器是基于apk的,由于原本镜像是Alpine 3.12的,查了Alpine官方的apk库,发现只有golang较低的版本,1.13,由于需要用到golang 1.16,这里记录升级安装方法。

首先golang官方是没有alpine linux的安装包的,其他Liunx系统的二进制包由于libc的不同肯定也是不能使用的,所以从源码编译安装成了唯一的可行的方法。

过程如下:

export GOARCH='amd64' GOOS='linux';  
wget  -O go.tgz https://dl.google.com/go/go1.16.12.src.tar.gz
tar -C /usr/local -xzf go.tgz;
rm -f  go.tgz
#由于golang已经实现bootstrap了,需要安装gcc bash musl golang 1.3的来编译
apk add --no-cache --virtual .build-deps \
        bash \
        gcc \
        go \
        musl-dev \
        
cd /usr/local/go/src
export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH";  #编译环境便利
./make.bash;  #编译
go install std; 

完成后在/usr/local/go/bin就有新的golang文件,修改配置path环境变量或者把/usr/local/go/bin下的文件软链接到/usr/bin里面去就可以了

go version 

可以看到最新的版本

踩坑:

go install std

会安装golang的一些标准库,由于众所周知的原因,包会不能安装,需要人工处理
golang.org 在国内由于一些 众所周知的 原因无法直接访问,而go get在获取gocode、go-def、golint等插件依赖工具的源码时,需要从 golang.org 上拉取部分代码至GOPATH,自然就导致了最后这些依赖于 golang.org 代码的依赖工具安装失败。

解决也并不复杂:先通过git clone命令手动将依赖工具的源码拉取至GOPATH的对应路径,再通过go install命令安装依赖工具。

如上 建立/usr/local/go/src/golang.org/x 目录,到https://github.com/golang/ 上找到google发布的标准库,git clone 为对应的名字放到这个目录,再次运行go install std
如:

    mkdir -p /usr/local/go/src/golang.org/x 
    cd /usr/local/go/src/golang.org/x 
    git clone https://github.com/golang/tools.git tools

在采用alpine linux 安装的golang编译时,生成的文件可能在其他liunx系统下不能运行,原因也因为alpine的特殊性,解决如下:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

禁用CGO,不动态链接c库

Lokie博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.1 搭建 © 2014-2018 lokie.wang 版权所有 ICP证:沪ICP备18016993号
  • 联系邮箱:kitche1985@hotmail.com