Как мне сохранить модули 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 для контейнера.