我如何在Docker容器中持久使用1.11模块?

时间:2018-08-26 12:18:55

标签: docker go docker-compose vgo go-modules

我正在将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 :(得分:4)

有关模块的Wiki文章中未提及,但是通过阅读go tool上的更新文档,我发现使用Go模块时,go工具仍将使用{{1 }}来存储可用资源,即GOPATH

这意味着对于我的本地开发人员设置,我可以1.在容器中定义$GOPATH/pkg/mod并2.将本地GOPATH安装到容器的GOPATH中。

$GOPATH/pkg/mod

答案 1 :(得分:2)

您可以使用卷代替本地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上。