来自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$
- 运行在Docker HTTP运行状况检查的Consul返回“通过对等方重置连接”
- 如何输出除Go模板键或字段的第一个字符以外的所有字符?
- 通过docker连接golang和redis
- docker-compose oci运行时错误可执行文件未find(在链接的容器中)
- docker在内部是否使用像chroot,unshare,nsenter等的系统调用或lxc的包装
- 连接go和postgres与docker-compose
- 使用go编译交叉编译CGO_ENABLED – 警告:找不到libudev.so.1
- Docker与nginx反向代理到golang服务器的问题
- 如何从自定义dockerregistry与图像拖拉?