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