亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法使用 Docker SDK 中的端口范圍語法進行端口轉發

無法使用 Docker SDK 中的端口范圍語法進行端口轉發

Go
哈士奇WWW 2022-06-21 16:10:26
我正在嘗試使用 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 文檔中找不到任何關于此的內容。
查看完整描述

2 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

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 err

ports2, err := nat.NewPort("tcp", "11210-11211") // check err


ExposedPorts: 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,

    },

},


查看完整回答
反對 回復 2022-06-21
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

嘗試單獨添加每個端口而不是端口范圍:


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",

)


查看完整回答
反對 回復 2022-06-21
  • 2 回答
  • 0 關注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號