我想将 golang 单元测试封装在 docker-compose 脚本中,因为它依赖于多个外部服务。我的应用程序有很多依赖项,因此需要一段时间go get
.
如何以允许构建 docker 容器的方式缓存包,而无需每次要测试时下载所有依赖项?
我的 Dockerfile:
FROM golang:1.7
CMD ["go", "test", "-v"]
RUN mkdir -p /go/src/app
WORKDIR /go/src/app
COPY . /go/src/app
RUN go-wrapper download
RUN go-wrapper install
每次我想运行单元测试时我都会运行docker-compose up --build backend-test
在以下脚本上:
version: '2'
services:
...
backend-test:
build:
context: .
dockerfile: Dockerfile
image: backend-test
depends_on:
...
But now go-wrapper download
每次我想运行测试时都会调用它,并且需要很长时间才能完成。
解决方案?提前致谢!
我个人使用govendor https://github.com/kardianos/govendor。它根据 golang 供应商约定将您的依赖项保存在项目内的供应商目录中。这仍然需要在构建时复制到您的 docker 映像中。
但有充分的理由不供应商。例如,当您构建 pkg 时,您不应该供应商。当您有不同的 pkg 使用不同版本的依赖项时,事情就会变得混乱。这可以通过仅供应可执行文件来解决。
因此,如果您有充分的理由不供应商,您可以分开几个步骤。
将它们按正确的顺序排列会加快速度。
您可以创建一个 shell 脚本(get.sh
) 和一些go get
依赖命令。 (你可以将它们放入你的 Dockerfile 中,但它们有行数限制)
go get github.com/golang/protobuf/proto
go get github.com/pborman/uuid
go get golang.org/x/net/context
go get golang.org/x/net/http2
go get golang.org/x/net/http2/hpack
然后在 Dockerfile 中首先复制并执行 shell 脚本。
每次更新 get.sh 时,它都会完全重建。它仍然运行got get ./...
以确保所有依赖项都存在。但如果所有内容都添加到get.sh
脚本,您将获得相当大的速度提升。
FROM golang:1.6
RUN mkdir -p /go/src/app
COPY get.sh /go/src/app
WORKDIR /go/src/app
RUN bash get.sh
COPY . /go/src/app
RUN go get ./...
CMD go test -v
总的想法是,您要经常更改 Dockerfile 中较低的内容,而顶部的内容则相当恒定。即使您必须添加一两个命令。 Docker 会逐行进行,直到找到需要重建的内容,然后也会执行此后的每一行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)