加快码头建设的golang vendoring

时间:2016-07-27 16:22:23

标签: go docker

我有一个FROM golang:1.6-alpine的Dockerfile。我想在执行docker build时尽可能多地使用docker图像缓存来加快速度。

为此,我想我会先添加ADD vendor /go/src/…/mypackage/vendor作为第一步,然后运行go install -v …/mypackage。但是,这会导致销售的包(构建时间的大部分)只能构建。

是否有显式构建所有已售出的软件包(即…/vendor目录中的源代码),但仅限于它们?

我希望我的Dockerfile看起来像这样:

FROM golang:1.6-alpine

ADD vendor /go/src/github.com/myuser/package/vendor
# missing: magic command to build only the vendored packages above

ADD *.go /go/src/github.com/myuser/package
RUN go install -v "github.com/myuser/package

1 个答案:

答案 0 :(得分:2)

  • 在主机(docker容器外部)中,包仍存储在/vendor文件夹中。这允许方便地管理这些依赖性。我个人使用godep来管理它。
  • 在容器内部,我不是将/vendor文件夹添加到我的包的子目录中,而是直接在源目录/vendor下的/go/src文件夹中添加所有包。 / LI>
  • 由于go的所有内容都是关于更改导入路径的,因此构建工件存储在/pkg目录中,无论它们是否已被出售'或不,这个解决方案是稳定的。
  • 为了享受加速,并且不必重建所有已销售的软件包,除非它们已被更改,Dockerfile在添加go install ./...后在src目录上运行vendor文件夹,然后继续构建的其余部分。

Dockerfile:

FROM golang:1.6-alpine

# Add and install all vendored packages.
ADD vendor /go/src/
RUN cd /go/src && go install -v ./...

# ...

# Add and install our package's source files, without the vendor folder
ADD *.go "/go/src/github.com/myuser/mypackage"
RUN go install -v "/go/src/github.com/myuser/mypackage"