go通过docker sdk进入容器执行命令

代码部分

package main

import (
	"context"
	"fmt"
	"io"
	"os"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"
)

func main() {
	// 设置远程Docker守护进程的地址
	remoteDockerURL := "tcp://10.0.0.12:2376" // 将remote-docker-host替换为远程Docker守护进程的IP地址或域名

	// 创建Docker客户端,并指定远程Docker守护进程地址
	cli, err := client.NewClientWithOpts(
		client.WithHost(remoteDockerURL),
		// client.WithVersion("1.41"),
		client.WithAPIVersionNegotiation(),
	)
	if err != nil {
		fmt.Println("创建docker客户端失败:", err)
		os.Exit(1)
	}
	// 要进入的容器ID
	containerID := "httpbin"

	// 容器执行命令的配置
	execConfig := types.ExecConfig{
		Cmd:          []string{"ls", "-l"}, // 要执行的命令及其参数
		AttachStdout: true,                 // 指定是否将标准输出附加到当前进程的stdout
		AttachStderr: true,                 // 指定是否将标准错误附加到当前进程的stderr
		Tty:          false,                // 指定是否为执行分配一个tty
	}

	// 创建容器执行命令
	execID, err := cli.ContainerExecCreate(context.Background(), containerID, execConfig)
	if err != nil {
		fmt.Println("Failed to create exec command:", err)
		return
	}

	// 执行容器命令并获取输出
	resp, err := cli.ContainerExecAttach(context.Background(), execID.ID, types.ExecStartCheck{})
	if err != nil {
		fmt.Println("Failed to attach to exec command:", err)
		return
	}
	defer resp.Close()

	// 将容器命令的输出复制到当前进程的stdout
	_, err = io.Copy(os.Stdout, resp.Reader)
	if err != nil {
		fmt.Println("Failed to copy output:", err)
		return
	}

	// 关闭Docker客户端连接
	defer cli.Close()
}
posted @ 2023-07-19 14:42  厚礼蝎  阅读(341)  评论(0)    收藏  举报