在docker api的golang sdk中为ContainerCreate函数设置PortBindingsconfiguration

基本上我需要这样的事情

docker run -p something:something --name xxxx imagename 

在golang sdk(这一个https://docs.docker.com/engine/api/sdks/ )为dockerAPI,我现在的代码看起来像这样

 exposedPorts, portBindings, _ := nat.ParsePortSpecs([]string{ "127.0.0.1:8080:2368", }) // Running the ghost container createdBody, err := dockerClient.ContainerCreate(context.Background(), &container.Config{ Image: "ghost:latest", ExposedPorts: exposedPorts,// it supposed to be nat.PortSet }, &container.HostConfig{ PortBindings: portBindings,// it supposed to be nat.PortMap }, &network.NetworkingConfig{}, containerName) 

我使用这个https://github.com/docker/go-connections/blob/master/nat/nat.go#L126 ParsePortSpecs函数返回(map [Port] struct {},map [Port] [] PortBinding ,错误),但是因为container.Config.ExposedPorts是nat.PortSet(它实际上是map [Port] struct {} tho),而containter.HostConfig.PortBindins是nat.PortMap

我不知道是否我想使用这个客户端https://github.com/fsouza/go-dockerclient,因为我目前的docker API版本是1.25,并且不支持API版本高于1.23

自1月份以来,Docker Client Go SDK可能已经发生了一些变化,但是我刚刚得到了这个工作,所以我将logging下我在这里所做的。

如果你需要一个暴露的端口,在docker ps PORTS下看起来像4140/tcp ,那么你可以执行以下操作:

 config := &container.Config{ Image: "nginx", ExposedPorts: nat.PortSet{ "4140/tcp": struct{}{}, }, } hostConfig := &container.HostConfig{} ctx := context.Background() containerResp, err := Docker.ContainerCreate(ctx, config, hostConfig, nil, "") if err != nil { panic(err) } if err := Docker.ContainerStart(ctx, containerResp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } 

如果您希望将该端口绑定到位于docker docker ps上的PORTS下的0.0.0.0( 0.0.0.0:4140->4140/tcp 4140/tcp)上的主机,则需要将端口绑定添加到hostConfig:

 config := &container.Config{ Image: "nginx", ExposedPorts: nat.PortSet{ "4140/tcp": struct{}{}, }, } hostConfig := &container.HostConfig{ PortBindings: nat.PortMap{ "4140/tcp": []nat.PortBinding{ { HostIP: "0.0.0.0", HostPort: "4140", }, }, }, } ctx := context.Background() containerResp, err := Docker.ContainerCreate(ctx, config, hostConfig, nil, "") if err != nil { panic(err) } if err := Docker.ContainerStart(ctx, containerResp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } 

希望这会节省一些人的时间:)

 containerCfg := &container.Config { Image: haproxyImage, Tty: true, OpenStdin: true, AttachStdout: true, AttachStderr: true, ExposedPorts: nat.PortSet{ nat.Port("443/tcp"): {}, nat.Port("10001/tcp"): {}, }, } hostConfig := &container.HostConfig{ Binds: []string{ "/var/run/docker.sock:/var/run/docker.sock", }, PortBindings: nat.PortMap{ nat.Port("443/tcp"): []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: "443"}}, nat.Port("10001/tcp"): []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: "10001"}}, }, }