Docker, Supervisord и supervisor-stdout

Я пытаюсь централизовать вывод из supervisord и его процессов, используя supervisor-stdout. Но с этой конфигурацией супервизора:

#supervisord.conf

[supervisord]
nodaemon = true

[program:nginx]
command = /usr/sbin/nginx
stdout_events_enabled = true
stderr_events_enabled = true

[eventlistener:stdout]
command = supervisor_stdout
buffer_size = 100
events = PROCESS_LOG
result_handler = supervisor_stdout:event_handler

(Обратите внимание, что раздел конфигурации supervisor-stoud точно такой же, как и в примере на сайте supervisor-stoud. ).

...и этот Dockerfile:

#Dockerfile

FROM python:3-onbuild

RUN apt-get update && apt-get install -y nginx supervisor

# Setup supervisord
RUN pip install supervisor-stdout
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY nginx.conf /etc/nginx/nginx.conf

# restart nginx to load the config
RUN service nginx stop

# Start processes
CMD supervisord -c /etc/supervisor/conf.d/supervisord.conf -n

Я могу создать образ просто отлично, но запуск из него контейнера дает мне:

Ошибка: supervisor_stdout:event_handler не может быть разрешен в [eventlistener:stdout]

ИЗМЕНИТЬ

Результат запуска:

supervisord -c /etc/supervisor/conf.d/supervisord.conf -n

is:

Error: supervisor_stdout:event_handler cannot be resolved within [eventlistener:stdout]
For help, use /usr/bin/supervisord -h

person Berco Beute    schedule 22.04.2015    source источник
comment
Каков результат supervisord -c /etc/supervisor/conf.d/supervisord.conf -n, когда вы запускаете его вручную в контейнере? Использование: docker exec <cid> /bin/bash   -  person James Mills    schedule 22.04.2015
comment
Добавлен результат запуска supervisord -c /etc/supervisor/conf.d/supervisord.conf -n   -  person Berco Beute    schedule 22.04.2015
comment
Я не понимаю, как/почему вы получаете другую ошибку, о которой вы сообщили в своем вопросе?   -  person James Mills    schedule 22.04.2015
comment
Извините, вставил неверный вывод. Дух. Исправлено.   -  person Berco Beute    schedule 22.04.2015


Ответы (4)


У меня была точно такая же проблема, и я решил ее, используя Ubuntu 14.04 в качестве базового изображения вместо Debian Jessie (я использовал изображение python:2.7, основанное на Джесси).

Вы можете обратиться к этой полной рабочей реализации: https://github.com/rehabstudio/docker-gunicorn-nginx.

РЕДАКТИРОВАТЬ: как указал @Vin-G в своем комментарии, это может быть связано с тем, что версия супервизора, поставляемая с Debian Jessie, слишком старая. Вы можете попробовать удалить его из apt и вместо этого установить с помощью pip.

person Alexandre Bulté    schedule 22.09.2015
comment
Это может сработать, но это немного излишне, см. Мой ответ, чтобы узнать, почему и как это исправить. - person João Antunes; 30.11.2015

У меня была та же проблема, короче говоря, вам нужно установить пакет Python, который предоставляет этот обработчик supervisor_stdout:event_handler. Вы должны быть в состоянии, введя следующие команды:

apt-get install -y python-pip
pip install supervisor-stdout

Если у вас установлен pip в этом контейнере, просто:

pip install supervisor-stdout должно быть достаточно, дополнительную информацию об этом конкретном пакете можно найти здесь:

https://pypi.python.org/pypi/supervisor-stdout

Насколько я знаю, нет пакета Debian, который предоставляет supervisor-stdout, поэтому самый простой способ установить его — через pip.

Надеюсь, это поможет тому, кто придет сюда, как я.

[Изменить] Как предложил Vin-G, если у вас все еще есть проблема даже после выполнения этих шагов, супервизор может застрять в старой версии. Попробуйте обновить его.

Ваше здоровье!

person João Antunes    schedule 26.11.2015
comment
Я пробовал это, но это не сработало. Также обратите внимание, что в исходном вопросе говорится, что pip install supervisor-stdout выполнено, и это не решает проблему. - person Alexandre Bulté; 01.12.2015
comment
Да, ты прав. Я озадачен, у меня была та же проблема, что и у вас, и этот pip install supervisor-stdout помог. Если у вас все еще есть журналы сборки докера, чтобы пролить свет на проблему, отлично! Если нет, я просто оставлю свой ответ здесь, потому что это сделало это для меня, и довольно сложно изменить весь базовый образ контейнера, если вам это не нужно. - person João Antunes; 05.12.2015
comment
Я столкнулся с той же проблемой @AlexandreBulté (решение не работает, даже если пакет был установлен через pip). Я считаю, что здесь ошибка в том, что системный пакет супервизора слишком старой версии. Чтобы это исправить, удалите супервизора из apt-get install, затем выполните pip install supervisor supervisor-stdout. JoãoAntunes, возможно, вы захотите отредактировать свой ответ. Я думаю, это то, что решило бы проблему оп - person Vin-G; 28.12.2015
comment
FWIW, это исправляет это для меня, используя последний образ Ubuntu 14.04. - person vicTROLLA; 02.01.2016
comment
Является ли супервизор 3.2.0 устаревшим для этой проблемы? - person Rogério Peixoto; 04.07.2016
comment
Это работает на Debian, спасибо. Кстати, без этого он не работает даже на Debian 10 (Buster). - person Matt Browne; 16.11.2019

Очень похоже на вышеизложенное, но я не думаю, что есть полный ответ.

Мне пришлось удалить из apt

apt-get remove supervisor

Затем переустановите с pip, но с pip2, так как текущая версия супервизора не поддерживает python 3.

apt-get install -y python-pip
pip2 install supervisor
pip2 install supervisor-stdout

Это все тогда работало.

Хотя путь супервизора теперь

/usr/local/bin/supervisord

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

person James Dunmore    schedule 16.06.2016

Я использовал этот хакерский способ, чтобы заставить его работать. Это работает и в Debian Jessie.

Я просто вставил файл этого парня в один из моих собственных файлов в каталог моего проекта. Нравится /app/supervisord_stdout.py

Затем я добавил его в conf следующим образом. /app — это каталог проекта для моих файлов проекта в контейнере.

[eventlistener:stdout]
command = python supervisord_stdout.py
buffer_size = 100
events = PROCESS_LOG
directory=/app
result_handler=supervisord_stdout:event_handler
environment=PYTHONPATH=/app
person Abhishek Jebaraj    schedule 14.11.2018