可以使用 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'命令。最后,我们读取了容器命令运行后的结果返回。注意,我们在最后停止并删除了该容器。

Golang Docker SDK 中使用 ContainerAttach 向容器输入命令并获取结果

原文地址: https://www.cveoy.top/t/topic/kWr2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录