gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:08:16 24 4
gpt4 key购买 nike

我正在尝试使用 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 文档中找不到任何关于此的内容。

最佳答案

nat.PortSet 是一张带有 nat.Port 的 map 是它的关键类型:

type PortSet map[Port]struct{}
您的 "2001-2006" 的“端口”规范语法上有效,因为它是一个无类型的字符串常量,可以转换为 nat.Port其中有 string作为其基础类型,但此字符串文字缺少协议(protocol)规范(例如 tcpudp )。
而是使用 nat.NewPort() 创建 key 的函数:
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 field :
&container.HostConfig{
PortBindings: portBindings ,
Resources: container.Resources{
Memory: 1024 * 1000000,
},
},

关于docker - 无法使用 Docker SDK 中的端口范围语法进行端口转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63236679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com