1. 获取命令行在容器运行后的结果可以通过使用ExecCreate和ExecStart方法来实现。ExecCreate方法创建一个新的exec任务,返回一个exec任务的ID,然后使用ExecStart方法启动该任务,并使用ContainerAttach方法获取任务的输出结果。

示例代码:

cmd := []string{"ls", "-l"}
resp, err := cli.ContainerExecCreate(ctx, containerID, types.ExecConfig{
    Cmd: cmd,
})
if err != nil {
    log.Fatal(err)
}
execID := resp.ID
var stdoutBuf bytes.Buffer
var stderrBuf bytes.Buffer
err = cli.ContainerExecStart(ctx, execID, types.ExecStartCheck{})
if err != nil {
    log.Fatal(err)
}
err = cli.ContainerAttach(ctx, execID, types.ExecConfig{
    Tty: true,
}, &stdoutBuf, &stderrBuf)
if err != nil {
    log.Fatal(err)
}
fmt.Println(stdoutBuf.String())
  1. 重复调用ContainerAttach方法会报错之前的exec任务仍然存在,可以使用ExecInspect方法来检查exec任务是否已经完成,如果已经完成,则可以删除该任务。

示例代码:

execID := "xxxx"
execInfo, err := cli.ContainerExecInspect(ctx, execID)
if err != nil {
    log.Fatal(err)
}
if execInfo.Running {
    // exec任务正在运行,不能重复调用ContainerAttach方法
} else {
    // exec任务已经完成,可以删除该任务
    err = cli.ContainerExecRemove(ctx, execID)
    if err != nil {
        log.Fatal(err)
    }
}
``
golang ocker sdk中的ContainerAttach方法返回的不是命令行运行后的结果而是上一个输入的命令行如何获取命令行在容器运行后的结果还有重复调用ContainerAttach方法会报错之前的exec任务仍然存在如何解决

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

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