数字海洋液滴停止内的所有容器

All containers inside a digital ocean droplet stop

我有一个 Digital Ocean droplet,其中我 运行 4 个容器,每个容器有一个小的 python 应用程序。

有时(一两周一次),所有容器都会停止工作。这不是由其中的 python 个应用程序引起的。

我制作了一个 systemd 计时器,它每 30 分钟执行一个 bash 脚本来检查容器是否正在 运行ning,如果没有,则启动它们。 定时器工作了好几天,而且它从来不需要重启容器。

但是,有一天我通过 ssh 访问我的 droplet,发现容器已停止——然后 systemctl list-timers --all 告诉我定时器从系统定时器中消失了!它只是不存在了!

容器检查脚本正在写入日志,当容器停止时日志同时停止。

问题:

  1. 我如何找出停止我的容器的原因?

  2. 系统计时器怎么可能就这么消失了?

  3. 我该如何解决这个问题?

我是唯一一个可以通过 ssh 连接到那个 droplet 的人,所以其他人不能搞砸它。

CoreOS 集群在新版本的操作系统可用时自行重启。这意味着如果您在 CoreOS 机器上手动启动一个进程,在某个时候它可能会消失。

好消息是,有一种标准方法可以在 CoreOS 上进行 运行 进程,当机器运行时它会恢复运行 - 也就是说,您可以使用 systemd 单元。 CoreOS 在此处描述了单位是什么以及如何使用它们:https://coreos.com/docs/launching-containers/launching/getting-started-with-systemd/

简而言之,您可以通过三个步骤创建自己的单元:

将特殊格式的文件放入 /etc/systemd/system - 最简单的可能是

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker run mycontainer

[Install]
WantedBy=multi-user.target

然后,您需要设置您的系统,以便它可以使用

读取该文件(以及 运行 您的容器)
$ sudo systemctl enable foo.service
$ sudo systemctl start hello.service

link 中的文档有更多详细信息(我强烈建议在继续之前先看一下它 - 它很短!)