Golang Docker SDK 中使用 ContainerAttach 向容器输入命令并获取结果
可以使用 Docker SDK 中的 ContainerAttach 方法向容器中输入命令行,并获取容器命令运行后的结果返回。以下是一个示例代码:
package main
import (
"context"
"fmt"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
panic(err)
}
// 创建一个新的容器
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: 'alpine',
Cmd: []string{'echo', 'hello world'},
Tty: true,
}, nil, nil, '')
if err != nil {
panic(err)
}
// 启动容器
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
// 附加到容器
hijackedResp, err := cli.ContainerAttach(ctx, resp.ID, types.ContainerAttachOptions{
Stream: true,
Stdin: true,
Stdout: true,
Stderr: true,
})
if err != nil {
panic(err)
}
defer hijackedResp.Close()
// 向容器中输入命令行
cmd := 'ls -al'
if _, err := hijackedResp.Conn.Write([]byte(cmd + '\n')); err != nil {
panic(err)
}
// 读取容器命令运行后的结果返回
if _, err := io.Copy(os.Stdout, hijackedResp.Reader); err != nil {
panic(err)
}
// 停止容器
if err := cli.ContainerStop(ctx, resp.ID, nil); err != nil {
panic(err)
}
// 删除容器
if err := cli.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{}); err != nil {
panic(err)
}
}
在上面的示例代码中,我们创建了一个名为'alpine'的容器,并在其中运行了'echo hello world'命令。然后,我们附加到该容器并向其输入了'ls -al'命令。最后,我们读取了容器命令运行后的结果返回。注意,我们在最后停止并删除了该容器。
原文地址: https://www.cveoy.top/t/topic/kWr2 著作权归作者所有。请勿转载和采集!