我正在使用docker engine-api(github.com/docker/engine-api)执行一些命令

我使用client.ContainerExecCreate然后使用client.ContainerExecInspect来运行我的命令,然后获取命令退出代码(我在同一容器中运行多个命令,所以从ContainerInspect获取的退出代码对我来说是无用的。)

这是我用来在容器中执行命令的函数

http://pastebin.com/rTNVuv9T

但是ContainerExecInspect有时会返回错误的值,因为有时ContainerExecInspect在命令退出之前被调用,并且它表示退出代码为零,这是错误的

我写了一个测试用例来测试它

http://pastebin.com/PED1Rf4k

结果将不是233,而是0

我已经设置了ExecConfig.Detach = true和ExecStartCheck.Detach = true,但是没有帮助

有什么方法可以等到命令退出然后获得退出代码?

加成:

对于我正在运行的某些命令来说,shell脚本不是可执行文件,因此我想我需要给/ bin / bash加上前缀,然后等待容器退出,这不是我想要的,我想等待命令退出,并且容器仍在运行

最佳答案

我想我现在可以解决我的问题

要点是,当使用containerExecAttach时,它将暴露被劫持的连接,我可以通过从连接读取直到EOF来判断命令是否退出

有一些要设置的地方

  • 应该将ExecConfig AttachStdout设置为true
  • 然后从劫持的conn读取

  • 这是示例代码
    atinfo, err := cli.ContainerExecAttach(ctx, execID, ec)
    
    // error handling
    
    defer atinfo.Close()
    c = atinfo.Conn
    
    one := make([]byte, 1)
    _, err = c.Read(one)
    
    if err == io.EOF {
        println("Connection closed")
    }
    

    这将等到命令执行完成

    ExecConfig设置为
    ec.Detach = false
    ec.Tty = false
    ec.AttachStdout = true
    

    关于linux - docker API ContainerExecInspect无法获取正确的退出代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40492724/

    10-15 09:35