我正在使用官方的 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/