2

我在 Ubuntu 14.10 x64 上的 Docker 容器中运行 redis-server。如果我通过 phpRedisAdmin 访问 redis 数据库,进行一些编辑,然后将它们保存到磁盘,关闭容器然后重新启动它一切都很好 - 编辑的 redis 密钥存在且正确。但是,如果我编辑键然后关闭容器然后重新启动它,编辑不会坚持。

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

4

1 回答 1

3

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

需要注意的是,只有容器中的主进程(PID 1)会被发送信号。这意味着主进程必须负责关闭容器中的任何子进程,否则最终可能会出现僵尸进程。

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

于 2015-04-06T10:58:15.947 回答