【问题标题】:how to run docker run using Go Sdk for docker?如何使用 Go Sdk for docker 运行 docker run?
【发布时间】:2018-01-07 19:35:15
【问题描述】:

我想运行下面的 docker 命令 docker run ajaycs14/hello-world -p 1527:80 -d

如何使用Docker Go SDK实现以上功能?

运行图像的示例代码如下,来自官方文档,如何修改下面的代码以获取端口和分离模式等选项。请帮助我修改下面的代码以适用于上述命令(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)
}

【问题讨论】:

    标签: docker go


    【解决方案1】:

    ContainerCreate方法中的第三个参数是HostConfig,你需要用到它。如果您对设置端口感兴趣,那么您应该查看PortBindings 字段。您还需要为容器指定公开的端口。您可以通过将ExposedPorts 提供到container configuration(第二个参数)来做到这一点。
    而且我假设您的容器将默认以daemon 模式启动,因为您使用的是API 而不是cli 工具。

    这是一个工作示例:

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

    docker ps --all 的输出中,我可以看到我的端口:PORTS 127.0.0.1:8080->8080/tcp, 27017/tcp

    【讨论】:

    • 是的,容器以守护模式启动。如果您提供示例代码会很有帮助。
    • resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: imageName, }, &container.HostConfig{ PortBindings: {"9300:80"}, }, nil, "") if err != nil { panic(err) } 我正在尝试这个,但不起作用
    猜你喜欢
    • 2015-10-24
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2018-02-23
    相关资源
    最近更新 更多