我正在使用docker engine-api(github.com/docker/engine-api)来执行一些命令
我使用client.ContainerExecCreate然后使用client.ContainerExecInspect运行我的命令,然后获取命令退出代码(我在同一个容器中运行多个命令,因此从ContainerInspect获取的退出代码对我来说没用。)
这是我用来在容器中执行命令的函数
但是ContainerExecInspect有时会返回错误的值,因为有时在命令退出之前调用ContainerExecInspect并且它表示退出代码为零,这是错误的
我写了一个测试用例来测试它
结果不会是233,它将是0
我设置了ExecConfig.Detach = true和ExecStartCheck.Detach = true,但没有帮助
有没有办法等到命令退出然后获取退出代码?
增加:
对于我的一些命令运行是shell脚本而不是可执行文件,所以我认为我需要前缀/ bin / bash,并等待容器退出,不是我想要的,我想要等待命令退出,容器仍在运行
答案 0 :(得分:0)
我想现在我可以解决我的问题了
主要的一点是当使用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