2016-11-08 90 views
0

我使用泊塢窗引擎API(github.com/docker/engine-api)來執行一些命令搬運工API ContainerExecInspect不能得到正確的退出代碼

我用client.ContainerExecCreate然後client.ContainerExecInspect運行我命令,然後得到的命令退出代碼(我運行在同一個容器的多個命令,以便從ContainerInspect退出代碼得到的是無用的對我。)

這是我的函數使用容器來執行命令

http://pastebin.com/rTNVuv9T

但ContainerExecInspect某個時候返回錯誤的值,因爲有時ContainerExecInspect在命令退出之前調用它說退出代碼爲0,這是不對的

我寫測試用例來測試它

http://pastebin.com/PED1Rf4k

其結果不會是233,這將是0

我已經設置ExecConfig.Detach =真和ExecStartCheck.Detach =真實的,但沒有幫助

有什麼方法可以等到命令退出,然後獲得退出代碼?

增加:

對於我的一些命令運行的是shell腳本不是可執行文件,所以我想我需要前綴/斌/慶典,並等待容器退出,是不是我想要的,我要等待命令退出,容器仍在運行

+0

你是「命令」是'/斌/ bash',所以你要在bash進程退出代碼。如果您想從命令中退出代碼,請直接運行該命令。讀取退出代碼之前,您還需要等待容器停止。 – JimB

+0

事實上,我可以在某個時候得到正確的退出代碼(不是命令在測試用例中,我的意思是另一個命令),所以我不認爲這是命令「/ bin/bash」的問題,謝謝:) –

+0

@ VOID001 ,JimB是正確的,/ bin/bash會給出一個退出代碼,如233當一個孩子退出時,它也應該退出。在這種情況下,Docker運行/ bin/bash的exec.Command。因此,如果您將其更改爲其他命令,退出代碼就是該命令退出的代碼。 –

回答

0

現在我想我能解決我的問題

主要的一點使用containerExecAttach時,它會暴露被劫持的連接情況,我可以判斷出是否該命令通過讀取退出從直到EOF連接

有幾個點設置,則

  1. 應該建立ExecConfig AttachStdout爲true
  2. 然後從康涅狄格州劫持

讀到這裏是一個示例代碼

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 
+0

代碼使用的是不推薦使用的github.com/docker/engine-api,我會再次使用github.com/docker/docker嘗試它併發布我的結果 –