我有一个带有大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
然而,这会导致“无法找到包”错误(可能是因为您无法直接在供应商/中直接构建内容)。
有没有人能够解决这个问题?
答案 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
创建的图像层就会从缓存中重用。