Golang Docker SDK: 获取容器命令执行结果和解决重复调用 ContainerAttach 报错问题
使用 Golang Docker SDK 获取容器命令执行结果和解决重复调用 ContainerAttach 报错问题
获取容器命令执行结果
要获取容器命令执行结果,可以使用 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 报错的问题
重复调用 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/kZq0 著作权归作者所有。请勿转载和采集!