PID 1 в постоянстве Docker

Я настроил сервер Kippo для работы в док-контейнере. Все работает нормально, пока вы не убьете контейнер. Уничтожение контейнера (путем перезагрузки машины или уничтожения докеров) делает его непригодным для использования с помощью STDERR «Запущен другой сервер Twistd, PID 1». Как я могу решить эту проблему? У меня нет проблем со сбросом файловой системы контейнера или чем-то подобным, потому что все, что я хочу, регистрируется в базе данных. Большое спасибо


person spanagiot    schedule 14.09.2015    source источник


Ответы (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.

Надеюсь, это поможет!

person Glyph    schedule 14.09.2015
comment
Я уже указал pid-файл, который удаляется, если что-то пойдет не так. Моя проблема в том, что после убийства контейнера (не останавливая его) возникает проблема с Twistd, а не с kippo. И так как kippo работает через Twistd, Kippo не может работать. Можно ли как-то удалить все файлы pid и контейнер запустится как новенький? - person spanagiot; 15.09.2015
comment
Измените командную строку twistd, которая запускает kippo, так, как я описал в своем ответе, и не будет необходимости удалять файлы pid, так как они не будут ни записываться, ни проверяться. - person Glyph; 15.09.2015
comment
Рад это слышать - спасибо за продолжение и спасибо за использование Twisted! - person Glyph; 16.09.2015

Похоже, ваш pid1 в контейнере не убирает за собой должным образом, когда ему говорят остановиться. Вероятно, это означает, что он не удаляет свой pid-файл, поэтому, когда вы снова запускаете контейнер, он отказывается запускаться.

Один из способов справиться с этим может заключаться в том, чтобы ввести что-то вроде супервизора, который может обрабатывать получение стоп-сигнала, а затем корректно завершать работу сервера kippo.

Другим решением может быть простой запуск контейнера в режиме только для чтения. В режиме только для чтения контейнер не получает слой записи, а корневая файловая система доступна только для чтения. Однако Kippo может отказаться запускаться, если не может создать pid-файл для начала. (см. docker run --read-only)

Еще одним решением может быть создание сценария ENTRYPOINT, который удаляет pid-файл перед вызовом exec на kippo.

person programmerq    schedule 14.09.2015
comment
Kippo не будет работать в режиме только для чтения, так как необходимо сгенерировать некоторые ключи. Я постараюсь обеспечить их при строительстве. Кроме того, я не думаю, что проблема в kippo.pid, потому что он удаляется, если он уже существует. Где я могу найти pid-файл Twistd? - person spanagiot; 15.09.2015