首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker中的Golang编译缓存

Docker中的Golang编译缓存
EN

Stack Overflow用户
提问于 2017-10-25 20:10:14
回答 3查看 2.6K关注 0票数 5

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

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

使用不同的容器,每次构建的时间保持在28-30秒左右:

代码语言:javascript
复制
$ 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

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

代码语言:javascript
复制
$ 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之外的某个地方使用任何类型的缓存

EN

回答 3

Stack Overflow用户

发布于 2018-10-13 19:31:20

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

它基本上是说要将/root/.cache/go-build映射到您的主机go构建缓存文件夹。

在我的例子中,我在windows上,有一个项目需要与gcc进行交叉编译,我必须启动一个linux容器来构建要部署到高山容器的二进制文件,然后将其映射到一个数据卷:

some-volume-name:/root/.cache/go-build

票数 3
EN

Stack Overflow用户

发布于 2017-10-25 22:46:41

当您在golang容器中构建时,它使用此容器中的目录$GOPATH/pkg。如果您随后启动另一个golang容器,它将有一个空的$GOPATH/pkg。但是,如果您继续使用相同的容器(使用exec),则会重用$GOPATH/pkg。

rm -r $GOPATH/pkg/linux_amd64将仅删除本地计算机上的此目录。所以这是没有效果的。

重用同一容器的一种可能的替代方法是

  • 在第一次构建后提交容器,或
  • 将$GOPATH/pkg作为卷从主机或数据卷装载。
票数 0
EN

Stack Overflow用户

发布于 2017-10-27 01:28:51

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

我能够通过将gopath挂载为卷来产生所需的结果(正如您所做的,因此它应该可以工作……)。请看下面的代码片段。第一次编译这两个包,第二次只编译main。

附注:我使用这种方法的一个问题是,卷目录将“覆盖”(即阴影)该目录中任何已存在于图像中的内容,如果您只使用基础golang高山图像,这是很好的,因为/go应该是空的。

代码语言:javascript
复制
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$ 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46932077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档