在docka api的golang sdk中为ContainerCreate函数设置PortBindings配置

时间:2017-01-22 08:57:51

标签: go docker docker-api

基本上我需要这样的东西

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

在golang sdk(这个https://docs.docker.com/engine/api/sdks/)for docker api中,我的当前代码看起来像这样

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,error)但是失败,因为container.Config.ExposedPorts是nat。 PortSet(它实际上映射[Port] struct {} tho)和containter.HostConfig.PortBindins是nat.PortMap

我不确定是否要使用此客户端https://github.com/fsouza/go-dockerclient,因为我当前版本的docker API为1.25,并且它不支持高于1.23的API版本

2 个答案:

答案 0 :(得分:12)

自1月以来,Docker Client Go SDK可能已经发生了一些变化,但我刚刚开始工作,所以我将记录我在这里所做的事情。

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

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)
}

如果您想将该端口绑定到0.0.0.0上的主机,在0.0.0.0:4140->4140/tcp上的PORTS下看起来像docker ps,则需要在端口绑定中添加到hostConfig:< / p>

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)
}

希望这能节省一些时间:)

答案 1 :(得分:3)

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