2

我正在尝试使用可从 github.com/docker/docker/client 获得的 docker API for golang。到目前为止,我能够在构建映像期间预定义的端口上启动容器。我正在尝试在运行时使用 API 映射端口;相当于

docker run -p 8083:8082 -d myImage:1.0.0

我尝试执行以下操作来映射端口:

host_config := &container.HostConfig{
     PortBindings: nat.PortMap{
     "8082/tcp": []nat.PortBinding{
         {
             HostIP: "0.0.0.0",
             HostPort: "8983",
         },
      },
   },
}

这里的问题是变量“nat”位于 API 的供应商文件夹中。我无法直接从 go vendor 文件夹中导入某些内容。stackoverflow 上有人建议将 go-connection 文件夹复制到 github 文件夹中,并删除嵌套的 vendor 目录。我按照建议做了,并创建了如下路径:

"github.com/docker/go-connections/nat"

现在我在编译时收到以下错误:

src\main\createcontainer1.go:53: cannot use "github.com/docker/go-connections/nat".PortSet literal (type "github.com/docker/go-connections/nat".PortSet) as type "github.com/docker/docker/vendor/github.com/docker/go-connections/nat".PortSet in field value

src\main\createcontainer1.go:65: cannot use "github.com/docker/go-connections/nat".PortMap literal (type "github.com/docker/go-connections/nat".PortMap) as type "github.com/docker/docker/vendor/github.com/docker/go-connections/nat".PortMap in field value

有没有人遇到过这个问题并克服了它?我正在使用 Go 版本 1.8。

4

1 回答 1

2

所以你需要做的不仅仅是复制它,你需要移动它。位于两个不同位置的同一个包对于 go 工具来说是不同的包(因为它不能保证它们是相同的,所以它使用完全限定的导入路径)。

如果您正在使用的包具有供应商目录,并且您需要使用其中的包,您有两种选择:

  • 将所有内容从vendor该包中的目录移到您的$GOPATH/src
  • 供应商包本身,然后将包vendor目录中的所有内容移动到项目的供应商目录 ( <project root>/vendor)。这被称为“扁平化”您的供应商依赖项,大多数 Go 供应商实用程序(例如,Govendor 或 Godep)可以自动或使用标志来执行此操作。不过,您也可以手动完成。

后者通常是推荐的策略。然而,重要的关键是包本身不能在其自己的vendor目录中拥有该库的版本,因为 Go 工具会自动使用它可以访问的最深的供应商版本的包。

于 2017-11-20T16:30:48.287 回答