8

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

由于应用程序依赖于数据库,因此我使用 adocker-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工具正在下载的模块?

4

2 回答 2

6

这在关于模块的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
于 2018-08-26T15:12:01.853 回答
4

您可以使用卷而不是本地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 上的所有更改。

于 2018-09-24T17:34:18.290 回答