Построить зависимости go в отдельном слое Docker - PullRequest
5 голосов
/ 27 марта 2019

Я пытаюсь ускорить сборку Docker моего приложения Go.В настоящее время, возможно, 60-е годы тратятся на создание зависимостей (это контроллер k8s, поэтому их много).

Одно очень важное ограничение: мой проект зависит от частных репозиториев GitHub.Я делаю go mod vendor за пределами docker build, где у меня есть кредиты для настройки репо.

Мой Dockerfile сейчас примерно равен:

FROM golang:1.12

WORKDIR /src

COPY . .
RUN go build -mod=vendor
...

Даже без необходимости загружать deps,эта сборка занимает некоторое время, потому что она перестраивает несколько сотен пакетов каждые docker build.

Что я хотел бы сделать, это что-то вроде:

FROM golang:1.12

WORKDIR /src

# these shouldn't change very often
COPY go.mod go.sum vendor ./
RUN go build -mod=vendor <all dependency packages>

COPY . .
RUN go build -mod=vendor
...

Я попытался разобрать go.mod, ноконечно, в котором перечислены модули, а не пакеты.Я пытался go list, но так и не смог получить рабочее заклинание.

1 Ответ

1 голос
/ 27 марта 2019

У меня есть неприятный хак, который, кажется, работает:

FROM golang:1.12

WORKDIR /src

COPY go.mod go.sum ./
COPY vendor/ ./vendor
RUN go build -mod=vendor $(cat deps|grep -v mypackage | grep -v internal)

COPY . .
RUN go build -mod=vendor
...
go list -f '{{join .Deps "\n"}}'  > deps
docker build .
...