Golang Docker SDK: 获取容器命令行执行结果 & 解决重复调用 ContainerAttach 报错问题

使用 Golang Docker SDK 的 ContainerAttach 方法执行容器命令时,返回的不是命令行运行后的结果,而是上一个输入的命令行。此外,重复调用 ContainerAttach 方法可能会报错“之前的 exec 任务仍然存在”。本文将介绍如何获取命令行在容器运行后的结果,以及如何解决重复调用 ContainerAttach 方法的报错问题。

获取容器命令行执行结果

要获取命令行在容器运行后的结果,可以使用 ContainerLogs 方法。该方法可以获取容器的标准输出和标准错误输出。

resp, err := cli.ContainerExecAttach(ctx, execID, types.ExecConfig{AttachStdout: true, AttachStderr: true})
if err != nil {
    return err
}
defer resp.Close()

output, err := ioutil.ReadAll(resp.Reader)
if err != nil {
    return err
}

fmt.Println(string(output))

解决重复调用 ContainerAttach 报错的问题

要解决重复调用 ContainerAttach 方法会报错之前的 exec 任务仍然存在的问题,可以使用 ContainerExecInspect 方法获取 exec 任务的状态,然后根据状态判断是否需要新建一个 exec 任务。

execID := ""
inspect, err := cli.ContainerExecInspect(ctx, execID)
if err != nil {
    // 如果 exec 任务不存在,则新建一个
exec, err := cli.ContainerExecCreate(ctx, containerID, types.ExecConfig{
        AttachStdout: true,
        AttachStderr: true,
        Cmd:          []string{"ls", "-l"},
    })
if err != nil {
        return err
    }
execID = exec.ID
} else {
    // 如果 exec 任务存在,则直接使用
execID = inspect.ID
}

resp, err := cli.ContainerExecAttach(ctx, execID, types.ExecConfig{AttachStdout: true, AttachStderr: true})
if err != nil {
    return err
}
defer resp.Close()

output, err := ioutil.ReadAll(resp.Reader)
if err != nil {
    return err
}

fmt.Println(string(output))

通过以上方法,您可以轻松获取容器命令行执行结果,并解决重复调用 ContainerAttach 方法的报错问题。

Golang Docker SDK: 获取容器命令行执行结果 & 解决重复调用 ContainerAttach 报错问题

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

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