Я работаю над проектом go, используя vgo, с Dockerfile, и я бы хотел, чтобы docker кэшировал зависимости проекта так, чтобы он имел два свойства:
- Если файл
go.mod
изменится, зависимости будут повторно загружены
- Если я изменю файл в пакете, но не изменю
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
, все зависимости будут загружены и перестроены, но в противном случае мы можем перейти прямо к созданию двоичного файла.
Я вижу несколько способов получить подобное поведение, но все они имеют недостатки:
- Я мог бы скопировать
$GOPATH/src/mod
в контейнер докера, но там будет много файлов, которые мне не нужны
- Я мог бы
vgo mod -vendor
до того, как я построю контейнер докера и скопирую каталог vendor, но разработчик должен помнить, что он должен запускать vgo mod -vendor
каждый раз, когда меняется go.mod
, иначе приложение не будет собираться и им придется запустить vgo mod -vendor
перед повторной попыткой сборки докера.
Можете ли вы придумать, как я могу вести себя как мой воображаемый vgo install_dependencies
? Мне не хватает трюка VGO, чтобы сделать это?