Как я могу сохранить модули go 1.11 в контейнере Docker?

Я переношу приложение Go 1.10 на Go 1.11. Это также включает переход с dep на _ 2_ для управления зависимостями.

Поскольку приложение зависит от базы данных, я использую docker-compose для настройки локальной среды разработки. В Go 1.10 я просто смонтировал локальный репозиторий (включая папку vendor) в правильное место в GOPATH контейнера:

web:
  image: golang:1.10
  working_dir: /go/src/github.com/me/my-project
  volumes:
    - .:/go/src/github.com/me/my-project
  environment:
    - GOPATH=/go
    - PORT=9999
  command: go run cmd/my-project/main.go

Поскольку в Go 1.11 нет GOPATH (при использовании модулей), я подумал, что могу просто сделать следующее:

web:
  image: golang:1.11rc2
  working_dir: /app
  volumes:
    - .:/app
  environment:
    - PORT=9999
  command: go run cmd/my-project/main.go

Это работает, но каждый раз, когда я docker-compose up (или любая другая команда, вызывающая инструмент Go), он разрешает и повторно загружает дерево зависимостей с нуля. Этого не происходит (скорее, только один раз), когда я запускаю команду вне контейнера (то есть в моей локальной ОС).

Как я могу улучшить настройку, чтобы в контейнере Docker сохранялись модули, загружаемые инструментом go?


person m90    schedule 26.08.2018    source источник
comment
вы всегда можете выполнить сборку на хосте, а затем просто передать двоичный файл в свой контейнер ... в моем случае компиляция происходит внутри другого контейнера   -  person Scott Stensland    schedule 25.09.2018
comment
Обратите внимание, что вы используете go1.11rc2, который является кандидатом на выпуск, а не окончательной версией go1.11.   -  person dolmen    schedule 16.11.2018


Ответы (2)


Это не упоминается в вики-статье о модулях, но после прочтения обновленных документов по инструменту go, я обнаружил, что при использовании модулей Go инструмент go по-прежнему будет использовать GOPATH для хранения доступных источников, а именно $GOPATH/pkg/mod.

Это означает, что для моей локальной настройки разработчика я могу 1. определить GOPATH в контейнере и 2. смонтировать локальный $GOPATH/pkg/mod в GOPATH контейнера.

web:
  image: golang:1.11rc2
  working_dir: /app
  volumes:
    - .:/app
    - $GOPATH/pkg/mod:/go/pkg/mod
  environment:
    - GOPATH=/go
    - PORT=9999
  command: go run cmd/my-project/main.go
person m90    schedule 26.08.2018
comment
Вы также можете создать новый том, чтобы изолировать gopath внутри контейнера докеров. - person Motakjuq; 24.09.2018
comment
@Motakjuq Как это будет выглядеть в файле docker-compose? - person m90; 24.09.2018

Вы можете использовать том вместо вашего локального GOPATH. docker-compose.yml похож на:

version: '3'

services:
  web:
    image: golang:1.11
    working_dir: /app
    volumes:
        - .:/app
        - cache:/go
    environment:
        - PORT=9999
    command: go run cmd/my-project/main.go

volumes:
  cache:

Том cache будет сохранять все изменения в GOPATH для контейнера.

person Motakjuq    schedule 24.09.2018