Как мне сохранить модули go 1.11 в контейнере Docker? - PullRequest
0 голосов
/ 26 августа 2018

Я перевожу приложение 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 ]

0 голосов
/ 24 сентября 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 для контейнера.

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

Это не упоминается в вики-статье о модулях, но, прочитав обновленную документацию по инструменту go , я обнаружил, что при использовании модулей Go инструмент go по-прежнему будет использовать * 1004. * для хранения доступных источников, а именно $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
...