ajayramesh
ajayramesh

Reputation: 3774

how to run docker run using Go Sdk for docker?

I want to run the below docker command docker run ajaycs14/hello-world -p 1527:80 -d.

How to achieve above using Docker Go SDK?

Sample code to run an image is below, which from official document, how to modify below code to take the options for port and detached mode etc. Please help me in modifying below code to work for above command(docker run ajaycs14/hello-world -p 1527:80 -d) ?

package main

import (
  "fmt"
  "io"
  "os"

  "github.com/docker/docker/api/types"
  "github.com/docker/docker/api/types/container"
  "github.com/docker/docker/client"
  "golang.org/x/net/context"
)

func main() {
  ctx := context.Background()
  cli, err := client.NewEnvClient()
  if err != nil {
    panic(err)
  }

  imageName := "bfirsh/reticulate-splines"

  out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{})
  if err != nil {
    panic(err)
  }
  io.Copy(os.Stdout, out)

  resp, err := cli.ContainerCreate(ctx, &container.Config{
    Image: imageName,
  }, nil, nil, "")
  if err != nil {
    panic(err)
  }

  if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
    panic(err)
  }

  fmt.Println(resp.ID)
}

Upvotes: 7

Views: 12397

Answers (1)

Pavlo Strokov
Pavlo Strokov

Reputation: 2087

In the method ContainerCreate the third parameter is HostConfig that you need to use. If you are interested in setting ports then you should take a look at PortBindings field. Also you need to specify exposed ports for container. You can do this by providing ExposedPorts into container configuration (second parameter).
And I assume that you container will be started in a daemon mode by default because you are using API instead of cli tool.

Here is a working example:

package main

import (
    "context"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/client"
    "github.com/docker/go-connections/nat"
)

func main() {
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    ctx := context.Background()
    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image:        "mongo",
        ExposedPorts: nat.PortSet{"8080": struct{}{}},
    }, &container.HostConfig{
        PortBindings: map[nat.Port][]nat.PortBinding{nat.Port("8080"): {{HostIP: "127.0.0.1", HostPort: "8080"}}},
    }, nil, "mongo-go-cli")
    if err != nil {
        panic(err)
    }

    if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
        panic(err)
    }
}

And in the output for docker ps --all I can see my port: PORTS 127.0.0.1:8080->8080/tcp, 27017/tcp

Upvotes: 14

Related Questions