使用Docker容器中的1.10构建缓存加速Go构建

时间:2018-05-25 01:05:21

标签: docker go

我有一个带有大vendor/目录的Go项目,几乎不会改变。

我正在尝试使用新的go 1.10 构建缓存功能来加速我在本地Docker引擎中的构建。

避免重新编译我的vendor/目录就足够了。所以我正在尝试使用Go等效于Python的这种常见Dockerfile模式:

FROM python
COPY requirements.txt .              # <-- copy your dependency list
RUN pip install -r requirements.txt  # <-- install dependencies
COPY ./src ...                       # <-- your actual code (everything above is cached)

同样我尝试过:

FROM golang:1.10-alpine
COPY ./vendor ./src/myproject/vendor
RUN go build -v myproject/vendor/... # <-- pre-build & cache "vendor/"
COPY . ./src/myproject

然而,这会导致“无法找到包”错误(可能是因为您无法直接在供应商/中直接构建内容)。

有没有人能够解决这个问题?

3 个答案:

答案 0 :(得分:2)

这对我有用:

FROM golang:1.10-alpine
WORKDIR /usr/local/go/src/github.com/myorg/myproject/
COPY vendor vendor
RUN find vendor -maxdepth 2 -mindepth 2 -type d -exec sh -c 'go install -i github.com/myorg/myproject/{}/... || true' \;
COPY main.go .
RUN go build main.go

确保首先安装已销售的库。只要你不改变一个库,你就是好的。

答案 1 :(得分:2)

只需使用go install -i ./vendor/...

考虑以下Dockerfile:

FROM    golang:1.10-alpine

ARG     APP
ENV     PTH $GOPATH/src/$APP
WORKDIR $PTH

# Pre-compile vendors.
COPY    vendor/ $PTH/vendor/
RUN     go install -i ./vendor/...

ADD     . $PTH/

# Display time taken and the list of the packages being compiled.
RUN     time go build -v

您可以通过以下方式测试它:

docker build -t test --build-arg APP=$(go list .) .

在我正在进行的项目中,没有预编译,每次需要大约12秒,每次90+包,之后需要大约1.2秒,只有3个(只有本地的)。

如果您仍然无法找到包&#34;,则表示缺少供应商。重新运行dep ensure应该修复它。

与Go无关的其他提示是.dockerignore*开头。即忽略所有内容,然后将您需要的内容列入白名单。

答案 2 :(得分:0)

从 Go 1.11 开始,您将使用 go 模块来完成此操作;

FROM golang
WORKDIR /src/myproject
COPY go.mod go.sum ./             # <-- copy your dependency list
RUN go mod download               # <-- install dependencies
COPY . .                          # <-- your actual code (everything above is cached)

只要go.sum不改变,go mod download创建的图像层就会从缓存中重用。