停止天气预报通知”;Docker容器意外停止”;

停止天气预报通知”;Docker容器意外停止”;,docker,synology,Docker,Synology,我有一个包含一个Node.js脚本的容器,它是通过CMD npm start启动的。脚本运行、执行一些工作并退出。节点进程退出,因为没有挂起的工作。npm启动成功退出。然后容器停止 我通过docker start xxxx从cronjob在Synology NAS上运行此容器。当它完成时,我从他们的警报系统中得到一个警报Docker container xxxx意外停止docker容器ls-a显示其状态为在5小时前退出(0)。如果我监视docker事件我会看到事件die与exitCode=0 似

我有一个包含一个Node.js脚本的容器,它是通过
CMD npm start
启动的。脚本运行、执行一些工作并退出。
节点
进程退出,因为没有挂起的工作。
npm启动
成功退出。然后容器停止

我通过
docker start xxxx
从cronjob在Synology NAS上运行此容器。当它完成时,我从他们的警报系统中得到一个警报Docker container xxxx意外停止
docker容器ls-a
显示其状态为
在5小时前退出(0)
。如果我监视
docker事件
我会看到事件
die
exitCode=0


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

我不熟悉Synology,因此我不确定是哪个组件引发了您提到的“警报”,但我想这只是一个警告而不是错误,因为:

  • 从POSIX的角度来看,退出状态为0是非常好的
  • “die”docker事件似乎也很常见,例如运行
    docker事件
    然后
    docker运行--rm-it debian bash-c“echo Hello”
    会产生相同的事件(而“kill”事件则更可疑)
所以,也许你只是因为Synology假设一个容器应该运行很长时间而得到这样一个警告

无论如何,以下是与您的问题相关的几点意见:

  • 您运行的映像/容器是否真的存在?(关于容器处理的数据)因为如果是这种情况,您可能更喜欢使用
    docker run--rm-i image\u name…
    docker run--rm-d-i image\u name…
    而不是执行
    docker start container\u name
    。(在这种情况下,多亏了
    --rm
    ,当容器停止时,将自动触发容器移除。)
  • 即使您提到的设置对于cron作业来说听起来相当合理(即,容器提前自动停止的事实),您可能会对它感兴趣,它提供了关于如何捕获由
    docker stop
    等发出的信号的更多细节

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

      • 容器退出时会出现
        die
        docker事件(当容器退出时,您可以通过监视
        docker事件
        看到这种情况)。这是容器中的主进程自行退出的任何情况。退出代码不重要
      • Synology Docker GUI将容器视为“已启用”。此信息存储在
        /var/packages/Docker/etc/container\u name.config
        中:
      {
      “启用”:正确,
      “出口”:假,
      “id”:“dbee87466fb70ea26cd9845fd79af16d793dc64d9453e4eba43430594ab4fa9b”,
      “图像”:“busybox”,
      “is_ddsm”:false,
      “is_package”:false,
      “姓名”:“默念”,
      “快捷方式”:{
      “启用快捷方式”:false,
      “启用_状态_页面”:false,
      “启用网页”:false,
      “网页url”:”
      }
      }
      
      如何使用Synology的Docker GUI启用/禁用容器 如果从GUI启动容器,容器将自动启用。所有这些都将导致容器变为“已启用”,并在退出时开始通知:

      • 将容器视图中的“切换开关”滑动到“打开”
      • 在容器上使用Action start
      • 打开容器详细信息面板并单击“开始”
      这可能就是您的容器最终“启用”的原因,也是它现在在退出时发出通知的原因。使用
      docker run-d…
      创建的容器不会启动,并且在退出时不会发出警告。这可能就是为什么像
      docker run-it--rm busybox
      和其他临时容器不会引起通知的原因

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

      • 一旦允许,将拨动开关滑到on(打开)位置,然后滑到off(关闭)位置
      • 使用Action start,然后在允许的情况下立即停止(这很难,因为如果容器非常短,会有额外的点击)
      • 打开控制器详细信息面板,单击开始,然后在“停止”未灰显时,单击“停止”

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

      来检查您的工作,这个问题可以在Synology上使用临时容器解决,因为它们一开始不是“启用”的,因此不会引起通知。长寿命容器的最终结果是,有人最终从GUI启动了它们一次,这导致GUI开始发出通知。@JenJackson好的,这是有道理的!谢谢你的跟进。
          {
             "enabled" : true,
             "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" : ""
             }
          }