Все контейнеры внутри цифровой океанической капли останавливаются
У меня есть дроплет Digital Ocean, где я запускаю 4 контейнера с одним небольшим приложением Python в каждом.
Время от времени (раз в неделю или две) все контейнеры просто перестают работать. Это не вызвано приложениями Python внутри них.
Я создал системный таймер, который выполняет скрипт bash каждые 30 минут, чтобы проверить, работают ли контейнеры, и, если нет, запускает их. Таймер работал несколько дней, и ему никогда не приходилось перезагружать контейнер.
Но однажды я ssh к моей капельке и вижу, что контейнеры остановлены - и systemctl list-timers --all
показывает мне, что таймер исчез из системных таймеров! Его просто больше нет!
Сценарий проверки контейнера записывал журналы, и журналы останавливаются одновременно с остановкой контейнеров.
Вопросы:
Как мне выяснить, что останавливает мои контейнеры?
Как это возможно, что системный таймер просто исчез?
Как это исправить?
Я единственный, кто может 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
Документ в ссылке содержит гораздо больше деталей (я настоятельно рекомендую взглянуть на него, прежде чем идти дальше - он короткий!)