Все контейнеры внутри цифровой океанической капли останавливаются

У меня есть дроплет Digital Ocean, где я запускаю 4 контейнера с одним небольшим приложением Python в каждом.

Время от времени (раз в неделю или две) все контейнеры просто перестают работать. Это не вызвано приложениями Python внутри них.

Я создал системный таймер, который выполняет скрипт bash каждые 30 минут, чтобы проверить, работают ли контейнеры, и, если нет, запускает их. Таймер работал несколько дней, и ему никогда не приходилось перезагружать контейнер.

Но однажды я ssh к моей капельке и вижу, что контейнеры остановлены - и systemctl list-timers --all показывает мне, что таймер исчез из системных таймеров! Его просто больше нет!

Сценарий проверки контейнера записывал журналы, и журналы останавливаются одновременно с остановкой контейнеров.

Вопросы:

  1. Как мне выяснить, что останавливает мои контейнеры?

  2. Как это возможно, что системный таймер просто исчез?

  3. Как это исправить?

Я единственный, кто может ssh к этой капле, так что кто-то другой не мог испортить это.

1 ответ

Решение

Кластеры CoreOS перезагружаются, когда становятся доступными новые версии операционной системы. Это означает, что если вы запускаете процесс на компьютере с CoreOS вручную, в какой-то момент он может исчезнуть.

Хорошая новость заключается в том, что существует стандартный способ запуска процессов в CoreOS, который будет восстанавливаться после загрузки машины, то есть вы можете использовать системные модули. 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

Документ в ссылке содержит гораздо больше деталей (я настоятельно рекомендую взглянуть на него, прежде чем идти дальше - он короткий!)

Другие вопросы по тегам