我怎样才能坚持在Docker容器中使用1.11模块?

m90*_*m90 7 go docker docker-compose vgo go-modules

我正在将Go 1.10应用程序迁移到Go 1.11.这还包括从迁移depmod管理依赖项.

由于应用程序依赖于数据库,我使用a 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
Run Code Online (Sandbox Code Playgroud)

由于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
Run Code Online (Sandbox Code Playgroud)

这是有效的,但每次我docker-compose up(或任何其他命令调用Go工具)它将从头开始解析并重新下载依赖关系树.当我在容器外部运行命令时(即在我的本地操作系统上),这不会发生(而只是一次).

如何改进设置,以便Docker容器持久保存go工具下载的模块?

小智 7

您可以使用卷代替本地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:
Run Code Online (Sandbox Code Playgroud)

该卷cache将保留容器 GOPATH 上的所有更改。


m90*_*m90 5

Wiki上有关模块的文章中没有提到这一点,但是通过阅读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
Run Code Online (Sandbox Code Playgroud)