docker api ContainerExecInspect无法获得正确的退出代码

时间:2016-11-08 17:12:32

标签: linux shell go docker

我正在使用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,并等待容器退出,不是我想要的,我想要等待命令退出,容器仍在运行

1 个答案:

答案 0 :(得分:0)

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

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

有几点要设置

  1. 应将ExecConfig AttachStdout设置为true
  2. 然后从劫持的conn中读取
  3. 以下是示例代码

    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