我正在使用官方的 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 容器的二进制文件,然后我将其映射到数据卷:
some-volume-name:/root/.cache/go-build

关于docker - 来自 Docker 的 Golang 编译缓存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46932077/

10-11 22:51
查看更多