停止 Synology 通知 "Docker container stopped unexpectedly"

Stop Synology notification "Docker container stopped unexpectedly"

我有一个容器,其中包含一个 Node.js 脚本,该脚本使用 CMD npm start 启动。脚本 运行s,做了一些工作,然后退出。 node 进程退出,因为没有待处理的工作。 npm start 成功退出。然后容器停止。

我 运行 通过 docker start xxxx 从 cronjob 将这个容器放在 Synology NAS 上。完成后,我从他们的警报系统收到警报 Docker 容器 xxxx 意外停止docker container ls -a 显示其状态为 Exited (0) 5 hours ago。如果我监视 docker events,我会看到事件 dieexitCode=0

我似乎需要通过生成 stop 事件而不是 die 事件来向系统发出信号,表明预期会退出。这是我可以在图像中或在 docker start 命令行上执行的操作吗?

我不熟悉 Synology,所以我不确定是哪个组件引发了你提到的 "alert",但我想这只是一个警告而不是错误,因为:

  • 从 POSIX 的角度来看,0 的退出状态非常好;
  • a "die" docker 事件似乎也很常见,例如运行宁 docker events 然后 docker run --rm -it debian bash -c "echo Hello" 产生相同的事件(而 "kill" 事件会更可疑)。

因此,也许您收到这样的警告只是因为 Synology 假定容器应该 运行ning 很长时间?

无论如何,这里有一些与您的问题相关的评论:

  • image/container你运行真的是ephemeral吗? (关于容器处理的数据)因为如果是这种情况,您可能更喜欢使用 docker run --rm -i image_name …docker run --rm -d -i image_name … 而不是 docker start container_name。 (在这种情况下感谢--rm,容器停止时将自动触发容器移除。)
  • 即使您提到的设置对于 cron 作业来说听起来很合理(即您的容器提前自动停止这一事实),您可能会对 感兴趣,它提供了有关如何捕获的更多详细信息docker stop等发出的信号

当满足以下两个条件时,Synology Docker 套件将生成通知 Docker 容器 xxxx 意外停止

  • 容器以 die docker 事件退出(当容器退出时,您可以通过监控 docker events 看到这种情况发生)。这是容器中的主进程自行退出的任何情况。 exitCode 无所谓。
  • 容器被 Synology Docker GUI 视为 "enabled"。此信息存储在 /var/packages/Docker/etc/<i>container_name</i>.config 中:
    {
       <b>"enabled" : true,</b>
       "exporting" : false,
       "id" : "dbee87466fb70ea26cd9845fd79af16d793dc64d9453e4eba43430594ab4fa9b",
       "image" : "busybox",
       "is_ddsm" : false,
       "is_package" : false,
       "name" : "musing_cori",
       "shortcut" : {
          "enable_shortcut" : false,
          "enable_status_page" : false,
          "enable_web_page" : false,
          "web_page_url" : ""
       }
    }

如何 enable/disable 容器与 Synology 的 Docker GUI

容器自动启用 如果您从 GUI 启动它们。所有这些都会导致容器变为 "enabled" 并在退出时开始通知:

  • 将容器视图中的"toggle switch"滑动到"on"
  • 在容器上使用 Action 启动。
  • 打开容器详细信息面板并单击 "start"

这可能就是您的容器的结局 "enabled" 以及它现在在退出时发出通知的原因。使用 docker run -d ... 创建的容器不会在开始时启用,并且最初不会在退出时发出警告。这可能就是 docker run -it --rm busybox 和其他临时容器不会引起通知的原因。

容器可以禁用如果你停止它们当它们运行.似乎无法禁用当前已停止的容器。因此,要禁用容器,您必须 启动它,然后在它自行退出之前停止它:

  • 滑动切换开关,然后尽快关闭。
  • 使用 Action 启动然后在它允许的情况下尽快停止(这很难,因为如果您的容器寿命很短,则需要额外的点击)。
  • 打开控制器详情面板,点击开始,然后只要"stop"没有变灰,点击"stop"。

通过查看 /var/packages/Docker/etc/<i>container_name</i>.config.

检查您的工作