英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论