Ускорение сборки Go с использованием кеша сборки go 1.10 в контейнерах Docker - PullRequest
0 голосов
/ 25 мая 2018

У меня есть проект Go с большим каталогом vendor/, который почти никогда не меняется.

Я пытаюсь использовать новую go 1.10 кэш сборки чтобы ускорить мои сборки в движке Docker локально.

Избегать перекомпиляции моего каталога vendor/ было бы достаточно для оптимизации.Поэтому я пытаюсь сделать Go эквивалентный этому общему шаблону Dockerfile для Python:

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

Однако это приводит к ошибке «не удается найти пакет» (скорее всего потому, что вы не можете собрать что-либо в вендоре / напрямую напрямую).

Кто-нибудь смог понять это?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Просто используйте 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 .) .

В проекте Iя работаю, без предварительной компиляции, это занимает ~ 12 секунд с пакетом 90+ каждый раз, после, это занимает ~ 1.2 с только 3 (только локальные).

Если у вас все еще есть "не могу найтипакет ", значит, отсутствуют продавцы.Повторный запуск dep ensure должен исправить это.

Другой совет, не связанный с Go, заключается в том, чтобы ваш .dockerignore начинался с *.т.е. игнорируй все и затем добавляй в белый список то, что тебе нужно.

0 голосов
/ 25 мая 2018

Вот кое-что, что работает для меня:

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

Это гарантирует, что вендорные библиотеки будут установлены первыми.Пока вы не меняете библиотеку, у вас все хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...