我正在使用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来判断命令是否退出
有一些要设置的地方
这是示例代码
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/