来自Docker的Golang编译caching

我正在使用官方的golang高山图像来编译我的源代码(我的主机是Mac),而且我注意到,即使在容器中挂载整个$GOPATH ,它也不会使用先前构build的caching数据。 我检查了它在$GOPATH/pkg目录中创build它,但它不影响后续的生成速度。

但是,如果我重复使用同一个容器进行多次编译,它确实使用了某种caching,您可以在本次实验中看到结果:

使用不同的容器,每个构build时间大约在28-30s左右:

 $ 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 

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

 $ 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 

$GOPATH以外的地方使用任何types的caching?

当你在golang容器内部build立时,它使用这个容器内的 $ GOPATH / pkg目录。 如果你然后启动另一个golang容器,它有一个空的$ GOPATH / pkg。 但是,如果您继续使用相同的容器(使用exec),则会重新使用$ GOPATH / pkg。

rm -r $GOPATH/pkg/linux_amd64将只会删除你的本地机器上的这个目录。 所以这没有效果。

重新使用同一个容器的可能替代scheme可能是

  • 在第一次构build之后提交容器,或者
  • 从主机或数据卷挂载$ GOPATH / pkg作为卷。

使用-v标志打印哪些软件包正在编译。 这可能是一个比花费时间更好的指标。

我能够通过将gopath作为音量来产生期望的结果(如你所做的那样,所以它应该工作…)。 请参阅下面的代码段。 第一次编译这两个包,第二次只是主。

附注:我用这种方法遇到的一个问题是音量目录将“覆盖”(即阴影)任何已经在图像上的目录,这是好的,如果你只使用基地golang高山形象,因为/去应该空着。

 pkm$ tree . └── src └── github.com ├── org1 │  └── mine │  └── main.go └── org2 └── somelib └── lib.go 6 directories, 2 files pkm$ docker run --rm -v $GOPATH:/go golang:1.9-alpine go build -i -v github.com/org1/mine github.com/org2/somelib github.com/org1/mine pkm$ tree . ├── mine ├── pkg │  └── linux_amd64 │  └── github.com │  └── org2 │  └── somelib.a └── src └── github.com ├── org1 │  └── mine │  └── main.go └── org2 └── somelib └── lib.go 10 directories, 4 files pkm$ docker run --rm -v $GOPATH:/go golang:1.9-alpine go build -i -v github.com/org1/mine github.com/org1/mine pkm$