Docker SDK 中 ContainerAttach 获取命令行运行结果问题及解决方案
使用 Docker SDK 中的 'ContainerAttach' 方法时,你可能发现通过 'Read' 方法得到的不是命令行运行后的结果,而是上一个输入的命令行。这是因为 'ContainerAttach' 方法返回的是容器的标准输出和标准错误流,而不是命令行运行后的结果。因此,读取这些流只能得到容器运行时的输出信息,而不能得到命令行运行后的结果。
要获取命令行运行后的结果,可以使用 'Exec' 方法来在容器内部执行命令。'Exec' 方法会返回一个执行结果对象,通过这个对象可以获得命令的输出信息、退出码等结果。
示例代码:
// 创建一个 Exec 请求
cmd := []string{"ls", " -l"}
execConfig := types.ExecConfig{
AttachStdout: true,
AttachStderr: true,
Cmd: cmd,
}
execID, err := cli.ContainerExecCreate(ctx, containerID, execConfig)
if err != nil {
log.Fatal(err)
}
// 执行命令
resp, err := cli.ContainerExecAttach(ctx, execID.ID, types.ExecStartCheck{})
if err != nil {
log.Fatal(err)
}
defer resp.Close()
// 读取命令输出
output, err := ioutil.ReadAll(resp.Reader)
if err != nil {
log.Fatal(err)
}
// 获取命令退出码
inspect, err := cli.ContainerExecInspect(ctx, execID.ID)
if err != nil {
log.Fatal(err)
}
exitCode := inspect.ExitCode
通过上述代码,你可以成功获取命令行运行后的结果和退出码。
原文地址: https://www.cveoy.top/t/topic/kWxr 著作权归作者所有。请勿转载和采集!