dtdr84101 2017-08-01 05:00
浏览 110
已采纳

如何使用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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 overleaf中论文编辑,报错`pages' is a missing field, not a string, for entry 4
  • ¥15 vhdl+MODELSIM
  • ¥20 simulink中怎么使用solve函数?
  • ¥30 dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,求解决办法
  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么