【问题标题】:How can I persist go 1.11 modules in a Docker container?如何在 Docker 容器中保留 go 1.11 模块?
【发布时间】:2018-09-25 01:34:18
【问题描述】:

我正在将 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 工具下载的模块?

【问题讨论】:

  • 您始终可以在主机上执行构建,然后只需将二进制文件提供给您的容器......在我的情况下,编译发生在不同的容器内
  • 请注意,您使用的是 go1.11rc2,它是一个候选版本,而不是最终的 go1.11 版本。

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


【解决方案1】:

这在模块的wiki文章中没有提到,但是通过阅读go tool上的更新文档,我发现在使用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

【讨论】:

  • 您还可以创建一个新卷以在 docker 容器内保留一个隔离的 gopath
  • @Motakjuq 在 docker-compose 文件中看起来如何?
【解决方案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 上的所有更改。

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2018-01-20
    • 1970-01-01
    • 2019-06-21
    • 2019-12-05
    • 2019-05-21
    相关资源
    最近更新 更多