Docker, Supervisor и 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 изображение, което е базирано на Jessie).

Можете да се обърнете към тази пълна работеща реализация: 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

AFAIK, няма пакет debian, който да предоставя supervisor-stdout, така че най-лесният метод за инсталиране е чрез pip.

Надявам се да помогне на всеки, който дойде тук като мен.

[Редактиране] Както предложи Vin-G, ако все още имате проблем дори след преминаване през тези стъпки, supervisor може да е заседнал в стара версия. Опитайте да го актуализирате.

наздраве!

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). Вярвам, че това, което не е наред тук, е, че пакетът на системата за надзорник е твърде стара версия. За да коригирате това, премахнете supervisor от apt-get install, след което направете pip install supervisor supervisor-stdout. JoãoAntunes, може да искате да редактирате отговора си с това. Мисля, че това би решило проблема на op - person Vin-G; 28.12.2015
comment
FWIW, това го коригира за мен, използвайки най-новото изображение на ubuntu 14.04. - person vicTROLLA; 02.01.2016
comment
Supervisor 3.2.0 счита ли се за стар за този проблем? - person Rogério Peixoto; 04.07.2016
comment
Това работи на Debian, благодаря. BTW не работи дори на Debian 10 (Buster) без това - person Matt Browne; 16.11.2019

Много подобно на горното, но не мисля, че има пълен отговор.

Трябваше да премахна от ап

apt-get remove supervisor

След това преинсталирайте с pip, но с pip2, тъй като текущата версия на supervisor не поддържа 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