golang ocker sdk中的ContainerAttach方法返回的不是命令行运行后的结果而是上一个输入的命令行如何获取命令行在容器运行后的结果还有重复调用ContainerAttach方法会报错之前的exec任务仍然存在如何解决docker sdk怎么搞的这么复杂官网也找不到相关资料。
关于获取命令行在容器运行后的结果,可以使用ContainerLogs方法来获取容器的输出日志。该方法可以指定日志的起始时间、结束时间、输出类型等参数。示例代码如下:
logs, err := cli.ContainerLogs(ctx, containerID, types.ContainerLogsOptions{
ShowStdout: true,
ShowStderr: true,
})
if err != nil {
log.Fatal(err)
}
defer logs.Close()
out, err := ioutil.ReadAll(logs)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
关于重复调用ContainerAttach方法会报错之前的exec任务仍然存在的问题,可以使用ExecStartCheck方法来检查前一个exec任务是否已经完成。如果前一个任务还未完成,则需要等待其完成后再执行新的任务。示例代码如下:
execID, err := cli.ContainerExecCreate(ctx, containerID, types.ExecConfig{
Cmd: []string{"ls", "-l"},
})
if err != nil {
log.Fatal(err)
}
resp, err := cli.ContainerExecAttach(ctx, execID.ID, types.ExecStartCheck{})
if err != nil {
log.Fatal(err)
}
defer resp.Close()
out, err := ioutil.ReadAll(resp.Reader)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
需要注意的是,如果容器中的命令执行时间较长,可能会导致ContainerAttach方法返回的上一个命令行还未执行完毕,此时需要等待一段时间后再调用该方法
原文地址: https://www.cveoy.top/t/topic/dBgI 著作权归作者所有。请勿转载和采集!