2017-09-05 122 views
0

我有一個docker容器,它運行node.js應用程序。此應用程序運行一個無頭鍍鉻實例。殭屍裏面的碼頭

,一切順利,但如果我殺了鍍鉻的實例,並檢查拼命地跑進程列表,我會看到2個(實際上是3 + 2的貓過程)殭屍鉻工藝(解散)仍處於系統。我知道這個程序是一個兒童 (死亡父母鉻工藝),這是未完成正確並附init過程。

我試圖直接殺死它 - 拒絕。另外我試圖用detached:true標誌產生鉻,並直接殺死所有子進程,當主鉻接收到「退出」信號時,無論如何ps -A | grep chrome顯示兩個不存在給我。有任何想法嗎?

UPD: 謝謝大家的幫助。添加--init完全解決了我的問題。使用另一個基本圖像也很好,但我決定這種方法不是必須的。也可以找到根本原因的好描述here

回答

-1

larsks幾乎是釘子的原因,linux系統上的init(或systemd)在其父母死亡時收穫殭屍進程。父母應該使用wait系統調用清理自己的殭屍進程。但是,該自動清理不會傳遞容器的名稱空間邊界。因此,無論您作爲入口點運行的進程是否爲pid 1,都需要爲您處理這些殭屍。

使用最新版本的docker,只需將--init傳遞給docker run命令即可包含init進程。如果您使用的是版本2.2撰寫文件,則可以在服務上定義一個選項init: true以獲得相同的結果。

除了dumb-init之外,還有tini,這是docker在封面下用作他們自己的docker-init的東西。

1

您需要一個過程,將調用wait()以獲得任何zombie processes。在常規系統上,這由/sbin/init處理,但在容器內部,您需要提供自己的工具。如果您正在開發自己的應用程序,請考慮定期在循環中調用wait()

或者,您可以考慮特定容器init,如dumb-init,看看是否可以解決問題。

+0

你是指在碼頭終端內運行「root @ daf1ccd11aaa:〜/ myapp#** wait **」(或者調用node.js exec('wait',()= {...})) ?如果是的話,它沒有幫助,如果我理解錯誤 - 請解釋你的建議 –

+0

閱讀關於殭屍進程的鏈接文章。您需要在容器中調用[等待系統調用](http://man7.org/linux/man-pages/man2/waitpid.2.html)的PID 1。使用'dumb-init'(或'supervisord'或其他進程管理器)之類的東西可以爲你做到這一點。 – larsks