Docker Redis容器有序closures

我在Ubuntu 14.10 x64的Docker容器中运行redis-server。 如果我通过phpRedisAdmin访问redis数据库,做一些编辑,然后把它们保存到磁盘,closures容器,然后重新启动它一切正常 – 编辑的redis键存在和正确。 但是,如果我编辑键,然后closures容器,然后重新启动编辑不会粘住。

显然,当容器closures时,dump.rdb文件不会自动保存。 我想我可以通过在/etc/rc6.d中插入一个/etc/init.d脚本来解决这个问题。 但是,我想知道为什么closures一个redis容器不能有序closures容器中的正在运行的进程? 毕竟,当我重新启动我的服务器(服务器和容器都运行Ubuntu 14.10),我不必显式提交redis数据库更改到磁盘。

在运行docker stop -t N CONTAINER时,Docker容器中的主进程将发送一个SIGTERM信号。 这个过程应该开始closures干净。 如果在N秒后(默认为10秒),这仍然没有发生,Docker将使用一个SIGKILL信号,这将杀死进程而不给它一个清理的机会。 您遇到问题的原因可能是因为您没有给Redis足够长的时间closures。

重要的是要注意,只有容器中的主进程(PID 1)将被发送信号。 这意味着主进程必须负责closures容器中的任何subprocess,否则最终会导致僵尸进程。

如果redis在关机时仍然没有做到你想做的事情,你可以把它包装在一个脚本中,作为PID 1,捕获SIGTERM信号并完成你想要的任何整理(只要确保你closures了redis和其他的你已经开始的进程)。