Docker Redis容器有序关闭

Docker Redis container orderly shutdown

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

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

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

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

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