我正在使用官方的golang高山镜像来编译我的源代码(我的主机是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是在$GOPATH之外的某个地方使用任何类型的缓存
发布于 2018-10-13 19:31:20
对于任何从谷歌搜索登录到这里的人,我在reddit post上找到了一个有效的答案。
它基本上是说要将/root/.cache/go-build映射到您的主机go构建缓存文件夹。
在我的例子中,我在windows上,有一个项目需要与gcc进行交叉编译,我必须启动一个linux容器来构建要部署到高山容器的二进制文件,然后将其映射到一个数据卷:
some-volume-name:/root/.cache/go-build
发布于 2017-10-25 22:46:41
当您在golang容器中构建时,它使用此容器中的目录$GOPATH/pkg。如果您随后启动另一个golang容器,它将有一个空的$GOPATH/pkg。但是,如果您继续使用相同的容器(使用exec),则会重用$GOPATH/pkg。
rm -r $GOPATH/pkg/linux_amd64将仅删除本地计算机上的此目录。所以这是没有效果的。
重用同一容器的一种可能的替代方法是
发布于 2017-10-27 01:28:51
使用-v标志打印正在编译的包。这可能是一个比花费时间更好的指标。
我能够通过将gopath挂载为卷来产生所需的结果(正如您所做的,因此它应该可以工作……)。请看下面的代码片段。第一次编译这两个包,第二次只编译main。
附注:我使用这种方法的一个问题是,卷目录将“覆盖”(即阴影)该目录中任何已存在于图像中的内容,如果您只使用基础golang高山图像,这是很好的,因为/go应该是空的。
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$ https://stackoverflow.com/questions/46932077
复制相似问题