无法使用 Docker SDK 中的端口范围语法进行端口转发

我正在尝试使用 Go SDK 运行 Docker 容器。从终端,我可以毫无问题地运行以下命令:


docker run -d --memory 1024M --name "cdb1" -p 2001-2006:8091-8096 -p 11210-11211:11210-11211 couchbase

我想使用Docker SDK for Go实现相同的目标,但找不到如何重现该-p 2001-2006:8091-8096部分。这是我的 ContainerCreate 调用:


cont, err := cli.ContainerCreate(

    context.Background(),

    &container.Config{

        Image: "couchbase",

        ExposedPorts: nat.PortSet{

            "2001-2006": struct{}{},

            "11210-11211": struct{}{},

        },

    },

    &container.HostConfig{

        PortBindings: nat.PortMap{

            "8091-8096": []nat.PortBinding{

                {

                    HostIP: "0.0.0.0",

                    HostPort: "2001-2006",

                },

            },

            "11210-11211": []nat.PortBinding{

                {

                    HostIP: "0.0.0.0",

                    HostPort: "11210-11211",

                },

            },

        },

        Resources: container.Resources{

            Memory: 1024 * 1000000,

        },

    },

    nil,

    "cdb1",

)

但是运行它总是会抛出同样的错误:


Error response from daemon: invalid port specification: "8091-8096"

进行更多测试,错误似乎专门来自该PortBindings部分(如果我删除这个并保留暴露的端口,它工作正常)。


我在 Docker 文档中找不到任何关于此的内容。


哈士奇WWW
浏览 253回答 2
2回答

UYOU

nat.PortSet是一个地图,nat.Port它的关键类型:type PortSet map[Port]struct{}你的“端口”规范在"2001-2006"语法上是有效的,因为它是一个无类型的字符串常量,可以转换为nat.Port它string的底层类型,但是这个字符串文字缺少协议规范(例如tcpor udp)。而是使用该nat.NewPort()函数来创建密钥:ports1, err := nat.NewPort("tcp", "2001-2006")   // check errports2, err := nat.NewPort("tcp", "11210-11211") // check errExposedPorts: nat.PortSet{    ports1: struct{}{},    ports2: struct{}{},},请注意,预期的“原始”字符串格式"2001-2006/tcp"也是可以接受的,但最好将此内部细节留给nat.NewPort().并构造一个nat.PortMap,使用nat.ParsePortSpec()效用函数。这是您可以组装的方式PortBindings:portBindings := nat.PortMap{}for _, rawMapping := range []string{    "0.0.0.0:2001-2006:8091-8096",    "0.0.0.0:11210-11211:11210-11211",} {    mappings, err := nat.ParsePortSpec(rawMapping)    if err != nil {        panic(err)    }    for _, pm := range mappings {        portBindings[pm.Port] = []nat.PortBinding{pm.Binding}    }}然后你可以使用portBindings上面的HostConfig.PortBindings字段:&container.HostConfig{    PortBindings: portBindings ,    Resources: container.Resources{        Memory: 1024 * 1000000,    },},

临摹微笑

尝试单独添加每个端口而不是端口范围:cont, err := cli.ContainerCreate(    context.Background(),    &container.Config{        Image: "couchbase",        ExposedPorts: nat.PortSet{            "2001": struct{}{},            "2002": struct{}{},            "2003": struct{}{},            "2004": struct{}{},            "2005": struct{}{},            "2006": struct{}{},            "11210": struct{}{},            "11211": struct{}{}        },    },    &container.HostConfig{        PortBindings: nat.PortMap{            "8091": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "2001",                },            },            "8092": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "2002",                },            },            "8093": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "2003",                },            },            "8094": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "2004",                },            },            "8095": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "2005",                },            },            "8096": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "2006",                },            },            "11210": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "11210",                },            },            "11211": []nat.PortBinding{                {                    HostIP: "0.0.0.0",                    HostPort: "11211",                },            }        },        Resources: container.Resources{            Memory: 1024 * 1000000,        },    },    nil,    "cdb1",)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go