使用Go SDK for Docker如何运行docker run命令?

huangapple go评论158阅读模式
英文:

how to run docker run using Go Sdk for docker?

问题

我可以帮你翻译以下内容:

我想运行下面的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)
}
英文:

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

得分: 13

ContainerCreate方法中,第三个参数是你需要使用的HostConfig。如果你想设置端口,你应该查看PortBindings字段。此外,你需要为容器指定暴露的端口。你可以通过在容器配置(第二个参数)中提供ExposedPorts来实现这一点。
我假设你使用API而不是CLI工具,所以默认情况下你的容器将以daemon模式启动。

以下是一个可行的示例:

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

英文:

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

huangapple
  • 本文由 发表于 2017年8月1日 13:00:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/45429276.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定