使用 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 方法返回的上一个命令行还未执行完毕,此时需要等待一段时间后再调用该方法。

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

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

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