dtdr84101
2017-08-01 05:00
浏览 95

如何使用Go SDK为docker运行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)
}
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dongshuo1257 2017-08-01 07:35
    已采纳

    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

    已采纳该答案
    打赏 评论