Я настроил сервер Kippo для работы в док-контейнере. Все работает нормально, пока вы не убьете контейнер. Уничтожение контейнера (путем перезагрузки машины или уничтожения докеров) делает его непригодным для использования с помощью STDERR «Запущен другой сервер Twistd, PID 1». Как я могу решить эту проблему? У меня нет проблем со сбросом файловой системы контейнера или чем-то подобным, потому что все, что я хочу, регистрируется в базе данных. Большое спасибо
PID 1 в постоянстве Docker
Ответы (2)
В Docker каждый контейнер работает в своем собственном пространстве имен PID. Это означает, что процесс, запущенный файлом докеров, всегда будет иметь PID 1, и PID будут отсчитываться от него.
twistd
ожидает, что PID достаточно недетерминированы, чтобы он мог проверить, не "уже ли запущен" другой twistd
, просто сравнив, чтобы убедиться, что PID тот же самый. Поскольку в Docker PID всегда будет равен 1, эта проверка всегда проходит успешно, и twistd
считает, что она не должна запускаться. Если контейнер завершится некорректно, twistd
не получит возможности очистить свой .pid
файл, и состояние будет сохранено в файловой системе контейнера.
Поскольку демон Docker будет использовать контейнеры пространства имен и в любом случае будет препятствовать одновременному запуску двух совпадающих процессов twistd
, файл .pid
и связанная с ним проверка на самом деле бесполезны, поэтому вам следует отключить его. Вы можете отключить его, изменив командную строку, включив параметр --pidfile=
(именно так, ничего после «=
») перед именем плагина. Я не знаком с Kippo, но для twistd web
это будет twistd --pidfile= web
.
Надеюсь, это поможет!
twistd
, которая запускает kippo, так, как я описал в своем ответе, и не будет необходимости удалять файлы pid, так как они не будут ни записываться, ни проверяться.
- person Glyph; 15.09.2015
Похоже, ваш pid1 в контейнере не убирает за собой должным образом, когда ему говорят остановиться. Вероятно, это означает, что он не удаляет свой pid-файл, поэтому, когда вы снова запускаете контейнер, он отказывается запускаться.
Один из способов справиться с этим может заключаться в том, чтобы ввести что-то вроде супервизора, который может обрабатывать получение стоп-сигнала, а затем корректно завершать работу сервера kippo.
Другим решением может быть простой запуск контейнера в режиме только для чтения. В режиме только для чтения контейнер не получает слой записи, а корневая файловая система доступна только для чтения. Однако Kippo может отказаться запускаться, если не может создать pid-файл для начала. (см. docker run --read-only
)
Еще одним решением может быть создание сценария ENTRYPOINT, который удаляет pid-файл перед вызовом exec на kippo.