【问题标题】:Docker Redis container orderly shutdownDocker Redis 容器有序关闭
【发布时间】:2015-06-10 12:55:52
【问题描述】:

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

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

【问题讨论】:

  • 如何停止容器?
  • 通过发出docker stop -t 0 containerid。自从发布此问题以来,我发现的一件事是,在 Docker 容器中通常不会发生 rullevel 处理。
  • 如果你这样做 -t 0 你是说在发出 sigkill 之前给它 0 秒,这不会给它时间自己整理。而是删除该参数或增加到-t 30 或其他内容。另外,redis pid 1 - 是否正确代理了信号?
  • 谢谢,我会试试的。但是 - 也许你知道:如果 Docker 容器不运行 /etc/rc6.d 中通常的运行级别脚本链接,那么 -t 30 (或其他)会有什么好处,因为无论如何都没有运行关闭脚本?
  • 你需要了解unix信号。 docker 容器中通常有 1 个进程,当您运行 docker stop 时,它将收到一个 SIGTERM,并自行关闭。如果它没有关闭,docker 将使用 SIGKILL 杀死它。如果容器中有多个进程,则由父进程关闭子进程。

标签: redis docker ubuntu-14.10


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 2019-02-12
    • 2016-01-01
    • 2019-06-06
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多