Как скачать все зависимости с vgo и заданным go.mod? - PullRequest
0 голосов
/ 01 июля 2018

Я работаю над проектом go, используя vgo, с Dockerfile, и я бы хотел, чтобы docker кэшировал зависимости проекта так, чтобы он имел два свойства:

  1. Если файл go.mod изменится, зависимости будут повторно загружены
  2. Если я изменю файл в пакете, но не изменю go.mod, зависимости не будут повторно загружены.

Прямо сейчас я делаю:

...
RUN go get -u golang.org/x/vgo
COPY . /go/src/whatever
RUN vgo install
...

Но если вы измените файл go, файл docker необходимо будет перестроить со слоя COPY и далее.

Короче говоря, я бы хотел:

...
RUN go get -u golang.org/x/vgo
COPY go.mod /go/src/whatever
RUN vgo install_dependencies
COPY . /go/src/whatever
RUN vgo install
...

Таким образом, если я изменю go.mod, все зависимости будут загружены и перестроены, но в противном случае мы можем перейти прямо к созданию двоичного файла.

Я вижу несколько способов получить подобное поведение, но все они имеют недостатки:

  1. Я мог бы скопировать $GOPATH/src/mod в контейнер докера, но там будет много файлов, которые мне не нужны
  2. Я мог бы vgo mod -vendor до того, как я построю контейнер докера и скопирую каталог vendor, но разработчик должен помнить, что он должен запускать vgo mod -vendor каждый раз, когда меняется go.mod, иначе приложение не будет собираться и им придется запустить vgo mod -vendor перед повторной попыткой сборки докера.

Можете ли вы придумать, как я могу вести себя как мой воображаемый vgo install_dependencies? Мне не хватает трюка VGO, чтобы сделать это?

Ответы [ 2 ]

0 голосов
/ 08 августа 2018

tl; dr: в текущей версии go master и в будущих версиях go, go mod download выполнит эту работу. А пока тебе нужен взлом.

На провисании сусликов я упоминал эту проблему: https://github.com/golang/go/issues/26610, где я узнал, что это будет делать более или менее то, что я хочу (при условии, что вы используете версию go 1.11beta3):

# Populate the module cache based on the go.{mod,sum} files.
COPY go.mod .
COPY go.sum .
RUN go list -e $(go list -f '{{.Path}}' -m all)

Позже в этой теме Расс Кокс реализует go mod download, который будет доступен в следующей версии go, что позволит мне удалить глупый взлом go list выше.

обновление: go mod download теперь широко доступно, и вы должны использовать его на ходу 1.12 и позже

0 голосов
/ 07 августа 2018

У меня была точно такая же проблема, я хотел сделать кеширование Docker более точным.

Итак, я только что написал свой собственный инструмент для этого: https://github.com/gladkikhartem/gomodget

Теперь мои конвейеры Docker-in-Docker занимают всего 10 секунд, и журнал сборки Docker выглядит следующим образом:

Step 4/15 : RUN go get -u golang.org/x/vgo
 ---> Using cache
 ---> 12c672a07a16
Step 5/15 : RUN go get github.com/gladkikhartem/gomodget
 ---> Using cache
 ---> acc70fea0edc
Step 7/15 : COPY go.mod .
 ---> Using cache
 ---> 41bae1ca7428
Step 8/15 : RUN gomodget
 ---> Using cache
 ---> 758100f7dde2
Step 9/15 : COPY . .
 ---> cc833c5bc810
Step 10/15 : RUN vgo build -ldflags '-extldflags "-static"' -o /bin/app 
...