2015-07-21 92 views
8

我有一個docker容器內運行的cronjob,它檢查所有服務是否按預期運行。如果這的cronjob確定存在一個問題,我想停止泊塢窗容器(從內...)從裏面停止docker容器

不幸的是exit只是停止我的cronjob腳本

+1

'shutdown -h now'? – zero323

+0

你的容器基於什麼形象? – Thomasleveil

+0

這是從Ubuntu的:12.04 –

回答

2

基本上,你需要PID 1退出停止容器。

我最初認爲kill -s SIGKILL 1會工作,但PID 1受保護,所以它不會。

正如@Thomasleveil所建議的那樣,您可以將代碼(如trap "exit" SIGINT SIGTERM)添加到PID 1腳本中,這將意味着發送kill -s SIGINT 1時進程將退出。我稍微喜歡這個方法(你直接殺死了子進程),因爲它給了父進程清理的機會,並且父進程應該能夠在沒有awk的情況下找到子進程的PID。

但是,如果您運行多個進程,則應考慮使用像supervisord或runit之類的東西。

+0

我也想到了,但無法使其工作。你會有一個Dockerfile用於展示嗎? – Thomasleveil

+0

呃,不是嗎?是否有錯誤訊息? cron作業運行的用戶是什麼? –

+0

我嘗試了一個shell腳本,其內容是'kill -s SIGKILL 1' +無限循環/睡眠,並使docker在啓動時(以root身份)運行該shell腳本。所以我沒有cron,只是一個簡單的腳本運行;也許一個過程不能自殺?同樣'man 2 kill'似乎表明kill命令拒絕向進程發送信號,如果該進程沒有明確定義該特定信號的處理程序的話。 – Thomasleveil

1

我試圖殺死進程1,但沒有成功。

試試看@ zero323與shutdown -h now的評論。它工作正常(對不起,我不能直接投票,因爲它不在答案列表中)。

+0

這是最新的ubuntu鏡像中發生的事情: > root @ b968bf313300:/#shutdown -h now 無法連接到總線:沒有這樣的文件或目錄 未能與init守護進程交談。 它什麼也沒做。 –

相關問題