Golang Docker SDK: 获取容器命令行执行结果 & 解决重复调用 ContainerAttach 报错问题
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 方法的报错问题。
原文地址: https://www.cveoy.top/t/topic/kZuW 著作权归作者所有。请勿转载和采集!