来自Docker的Golang编译缓存

我正在使用官方golang alpine图像来编译我的源代码(我的主机是Mac),我注意到即使在容器内部安装整个$GOPATH,它也不会使用以前版本中的缓存数据.我检查它是否在$GOPATH / pkg目录中创建它,但它不会影响后续的构建速度.

但是,如果我重复使用同一个容器进行多次编译,它确实会使用某种缓存,你可以在这个实验中看到我做的结果:

使用不同的容器,每个构建中的时间大约为28-30秒:

$rm -r $GOPATH/pkg/linux_amd64
$time docker run -v$GOPATH:/go -e CGO_ENABLED=0 golang:1.9-alpine3.6 go build -i github.com/myrepo/mypackage
...
0.02s user 0.08s system 0% cpu 30.914 total

$time docker run -v$GOPATH:/go -e CGO_ENABLED=0 golang:1.9-alpine3.6 go build -i github.com/myrepo/mypackage
...
0.02s user 0.07s system 0% cpu 28.128 total

重用相同的容器,后续构建要快得多:

$rm -r $GOPATH/pkg/linux_amd64    
$docker run -d -v$GOPATH:/go -e CGO_ENABLED=0 golang:1.9-alpine3.6 tail -f /dev/null
bb4c08867bf2a28ad87facf00fa9dcf2800ad480fe1e66eb4d8a4947a6efec1d

$time docker exec bb4c08867bf2 go build -i github.com/myrepo/mypackage
...
0.02s user 0.05s system 0% cpu 27.028 total

$time docker exec bb4c08867bf2 go build -i github.com/myrepo/mypackage
0.02s user 0.06s system 0% cpu 7.409 total

Go是否在$GOPATH之外的某些地方使用任何类型的缓存?

最佳答案 对于从谷歌搜索登陆这里的任何人,我在
reddit post找到了一个有效的答案.

它基本上是指将/root/.cache/go-build映射到主机go build cache文件夹.

在我的情况下,我在Windows上有一个需要与gcc交叉编译的项目,我不得不启动一个linux容器来构建要部署到alpine容器的二进制文件,然后我将它映射到数据卷:

一些批量名称:/root/.cache/go-build

点赞