2015-04-06 27 views
0

我在Ubuntu 14.10 x64的Docker容器中運行redis-server。如果我通過phpRedisAdmin訪問redis數據庫,請進行一些編輯,然後將它們保存到磁盤,關閉容器,然後重新啓動它,一切正常 - 編輯的redis鍵存在且正確。但是,如果我編輯鍵,然後關閉容器,然後重新啓動它,編輯不會粘住。Docker Redis容器有序關閉

很明顯,dump.rdb文件在容器關閉時不會自動保存。我想我可以通過在/etc/rc6.d中插入一個/etc/init.d腳本來解決這個問題。但是,我想知道 - 爲什麼關閉redis容器不能有序關閉容器中的正在運行的進程?畢竟,當我重新啓動服務器(服務器&容器運行Ubuntu 14.10)時,我不必顯式提交redis數據庫更改到磁盤。

+0

你是如何停止集裝箱? – 2015-04-06 09:32:24

+0

通過發出「docker stop -t 0 containerid」。自從發佈這個問題後,我發現了一件事,即在Docker容器中,通常的rullevel處理不會發生。 – DroidOS 2015-04-06 09:39:03

+1

如果你使用'-t 0',你會說在發出一個sigkill之前給它0秒,這不會讓它有時間來清理它自己。相反,刪除該論點或增加到「-t 30」或什麼的。另外,是redis pid 1 - 信號是否被正確代理? – 2015-04-06 09:55:07

回答

1

運行docker stop -t N CONTAINER時,Docker容器中的主進程將發送一個SIGTERM信號。這個過程應該開始徹底關閉。如果在N秒後(默認爲10秒),這仍然沒有發生,Docker將使用SIGKILL信號,這會在沒有給它清理機會的情況下終止進程。你遇到問題的原因可能是因爲你沒有給Redis足夠長的時間來徹底關閉。

重要的是要注意,只有容器中的主進程(PID 1)將被髮送信號。這意味着主進程必須負責關閉容器中的任何子進程,否則最終會導致殭屍進程。

如果redis在關機時仍然沒有做到你想做的事情,你可以將它包裝在一個腳本中,作爲PID 1,捕獲信號並完成你想要的任何整理(只要確保你關閉了redis以及您開始的其他任何進程)。