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

Я перевожу приложение Go 1.10 на Go 1.11. Это также включает в себя миграцию из dep в mod для управления зависимостями.

Поскольку приложение зависит от базы данных, я использую 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 инструмент?

2 ответа

Решение

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

Это означает, что для моей локальной установки dev я могу 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

Вы можете использовать объем вместо вашего местного 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 для контейнера.

Другие вопросы по тегам