0

我正在尝试使用 docker 的 go api 创建一个容器。我想container.Config.ExposedPortsContainerCreate()API 中公开一个端口。下面是代码

package main

import (
        "fmt"
        "context"
        "github.com/docker/docker/api/types/container"
        "github.com/docker/docker/client"
        "github.com/docker/go-connections/nat"
)

func main() {

        ctx := context.Background()
        cli, err := client.NewClientWithOpts(client.WithVersion("1.38"))
        if err != nil {
                fmt.Println("Failed to get container envoronment", err)
        }   

        resp, err := cli.ContainerCreate(ctx, &container.Config{
                Image: "hyperledger/fabric-ca",
                Cmd:   []string{"/bin/sh", "-c", "fabric-ca-server start -b admin:adminpw"},
                Env: []string{"FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server",
                        "FABRIC_CA_SERVER_CA_NAME=ca.example.com"},
                ExposedPorts: nat.PortSet{"22/tcp":struct{}{},},
        }, nil, nil, "ca.example.com")


        if err != nil {
                fmt.Println(" failed to create container, err:", err)
        } else {
                fmt.Println(" Container ID :", resp.ID, "warning:", resp.Warnings, "err:", err)
        }   
}

当我编译时出现以下错误

vignesh@vignesh-ThinkPad-E470 ~/go-book/src/github.com/my_fabric $ go build asd.go 
asd.go:8:9: cannot find package "github.com/docker/go-connections/nat" in any of:
    /home/vignesh/go-book/src/github.com/my_fabric/vendor/github.com/docker/go-connections/nat (vendor tree)
    /usr/local/go/src/github.com/docker/go-connections/nat (from $GOROOT)
    /home/vignesh/go-book/src/github.com/docker/go-connections/nat (from $GOPATH)

由于包"github.com/docker/go-connections/nat"位于供应商目录中"github.com/docker/docker/vendor/github.com/docker/go-connections/nat",因此我在工作目录中创建了供应商目录,并将其内容复制github.com/docker/docker/vendor/github.com/docker/go-connections/natgithub.com/my_fabric/vendor/go-connections/nat并用于"github.com/my_fabric/go-connections/nat"导入而不是"github.com/docker/go-connections/nat". 但我收到以下错误。

vignesh@vignesh-ThinkPad-E470 ~/go-book/src/github.com/my_fabric $ go build asd.go 
# command-line-arguments
./asd.go:25:29: cannot use "github.com/my_fabric/vendor/github.com/my_fabric/go-connections/nat".PortSet literal (type "github.com/my_fabric/vendor/github.com/my_fabric/go-connections/nat".PortSet) as type "github.com/docker/docker/vendor/github.com/docker/go-connections/nat".PortSet in field value

基本上我想使用 docker 存储库中 vendor 目录中的包。请帮助:)

4

2 回答 2

0

它只会尝试为 docker 环境中的供应商目录提供用户权限。因为导入包的供应商路径是正确的。

在 golang 中导入的工作原理是:- 首先它会从供应商目录中导入包,如果不是,它将$GOPATH为同一个包查找 src 目录。

该错误表示它无法在任何给定路径中找到包。但是您在供应商目录中拥有它,因此这可能是任何权限问题。

因为如果您在 linux 上工作就会发生这种情况,因此权限将不允许访问供应商目录。

此外,最好不要复制,而是Gopkg.toml在 docker 中使用生成供应商包。

于 2019-02-20T05:21:24.500 回答
0

这两个目录不等价:

github.com/docker/docker/vendor/github.com/docker/go-connections/nat
github.com/my_fabric/vendor/go-connections/nat

您必须将 Docker 的所有供应商依赖项原封不动地移动(而不是复制)到您自己的供应商目录中,例如应该存在以下目录:

github.com/my_fabric/vendor/github.com/docker/go-connections/nat

注意github.com/docker片段。如果你复制目录,你最终会得到两个包的副本,这会给你带来麻烦。例如,您最终会得到不同的类型

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

您根本不必更改导入语句。

于 2019-02-20T09:39:33.107 回答