首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Go 1.10在Docker容器中加速go构建

用Go 1.10在Docker容器中加速go构建
EN

Stack Overflow用户
提问于 2018-05-25 01:05:21
回答 4查看 4K关注 0票数 10

我有一个Go项目,它有一个很大的vendor/目录,几乎从未改变过。

我正在尝试使用新的去1.10 构建缓存功能来在本地加快我在Docker中的构建。

避免重新编译我的vendor/目录就足够优化了。因此,我试图将Go等效于Python的这种常见Dockerfile模式:

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

同样,我也尝试过:

代码语言:javascript
复制
FROM golang:1.10-alpine
COPY ./vendor ./src/myproject/vendor
RUN go build -v myproject/vendor/... # <-- pre-build & cache "vendor/"
COPY . ./src/myproject

但是,这会导致“无法找到包”错误(可能是因为您无法在供应商/通常情况下直接构建组件)。

有人能弄明白吗?

EN

回答 4

Stack Overflow用户

发布于 2018-05-25 06:46:15

以下是一些对我有用的东西:

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

它确保了首先安装了这些独立的库。只要你不改变图书馆,你就很好。

票数 3
EN

Stack Overflow用户

发布于 2018-05-25 12:29:41

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

考虑以下Dockerfile:

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

您可以测试它执行如下操作:

代码语言:javascript
复制
docker build -t test --build-arg APP=$(go list .) .

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

如果您仍然有“无法找到包”,这意味着有缺少供应商。重新运行dep ensure应该会修复它。

另一个不相关的提示是让您的.dockerignore*开始。也就是说,忽略一切,然后白名单你需要什么。

票数 3
EN

Stack Overflow用户

发布于 2021-01-14 15:24:02

从Go 1.11开始,您将使用go模块来完成这一任务;

代码语言:javascript
复制
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创建的图像层将从缓存中重用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50520103

复制
相关文章

相似问题

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