2015-07-13 46 views
1

我正在使用本搬運工issue找到的代碼基本上啓動一個容器中運行的20秒內的處理,並且如果完成/的過程沒有完成 X量殺死在容器中的無限過程/ 未能執行/超時無論容器是否被殺死。多克爾後的時間

我使用目前的代碼是這樣的:

#!/bin/bash 
set -e 

to=$1 
shift 

cont=$(docker run -d "[email protected]") 
code=$(timeout "$to" docker wait "$cont" || true) 
docker kill $cont &> /dev/null 
echo -n 'status: ' 
if [ -z "$code" ]; then 
    echo timeout 
else 
    echo exited: $code 
fi 

echo output: 
# pipe to sed simply for pretty nice indentation 
docker logs $cont | sed 's/^/\t/' 

docker rm $cont &> /dev/null 

這幾乎是完美的。然而,如果你運行一個無限的過程(例如這條巨蟒無限循環):

while True: 
    print "inifinte loop" 

整個系統果醬和應用程序崩潰後,閱讀了一下,我認爲這與STDOUT緩衝區有關,但我絕對不知道這是什麼意思?

回答

0

你的問題是與被寫入大量數據到標準輸出的過程。 這些消息得到登錄到無限增長的文件。 看一看(取決於你的系統的日誌文件的位置):

sudo find /var/lib/docker/containers/ -name '*.log' -ls 

可以刪除舊的日誌文件,如果他們不感興趣。 一種可能性是在文件的最大大小限制下啓動docker run -d守護進程 。 添加到您的腳本開始,例如:

ulimit -f 20000 -c 0 

這限制文件大小爲20000個* 1024個字節,並且禁用核心文件轉儲,您希望 從哪裏寫被迫失敗無限循環得到。

+0

嘿,我不知道在哪裏添加上面的代碼到我的代碼,任何想法? –

+0

在腳本中的'set -e'之後添加'ulimit'。由於docker可能需要將大文件用於除日誌以外的其他內容,因此可能需要增加限制。 – meuh

+0

乾杯不得不添加到碼頭虛擬機中運行的腳本,但它的工作方式就像它應該!謝謝 –

0

請在 CONT = $末尾添加&(泊塢窗運行-d 「$ @」)&

它會在後臺運行的進程。

我不知道,但碼頭工人若仍無法阻止你還可以在此行之後只添加以下內容:

mypid = $! 睡眠20 & &殺$ mypid

問候

+0

作爲後臺進程運行使得它變得更糟,而其他線路無法工作,Docker是微型虛擬機,我假設答案將是相當專業化的,但謝謝你的嘗試。 –

+0

對不起,是的,它是在後臺運行該進程的目的。否則,您將在啓動下一條指令之前等待循環完成。我想按退回,但似乎我的墊不能很好地工作。有2個命令:mypid = $! ;然後按回車^^和睡眠20 && kill $ mypid它會殺死你的虛擬機。這可能是更清潔的方式。我會檢查我是否可以找到任何文檔併發布更好的答案,如果我找到一個 –