Я пытаюсь использовать supervisord в контейнере докеров, чтобы попытаться контролировать два процесса внутри контейнера. На данный момент процесс 1 вводит каждые 10 секунд «Я — процесс 1», а процесс 2 — «Я — процесс 2». Они оба действительно простые скрипты bash.
В журналах докеров я встречаю эту ошибку:
2022-04-04T15:40:56.770705073Z I am process 1
2022-04-04T15:40:56.770775532Z 2022-04-04 15:40:56,770 CRIT uncaptured python exception, closing channel <POutputDispatcher at 140473979288352 for <Subprocess at 140473979288304 with name PROGRAM1 in state RUNNING> (stdout)> (<class 'OSError'>:[Errno 29] Illegal seek [/usr/lib/python3/dist-packages/supervisor/supervisord.py|runforever|218] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|handle_read_event|281] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|record_output|215] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|_log|184] [/usr/lib/python3/dist-packages/supervisor/loggers.py|info|327] [/usr/lib/python3/dist-packages/supervisor/loggers.py|log|345] [/usr/lib/python3/dist-packages/supervisor/loggers.py|emit|227] [/usr/lib/python3/dist-packages/supervisor/loggers.py|doRollover|264])
2022-04-04T15:41:06.761850899Z I am process 2
2022-04-04T15:41:06.761913329Z 2022-04-04 15:41:06,761 CRIT uncaptured python exception, closing channel <POutputDispatcher at 140473979378128 for <Subprocess at 140473979378224 with name PROGRAM2 in state RUNNING> (stdout)> (<class 'OSError'>:[Errno 29] Illegal seek [/usr/lib/python3/dist-packages/supervisor/supervisord.py|runforever|218] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|handle_read_event|281] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|record_output|215] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|_log|184] [/usr/lib/python3/dist-packages/supervisor/loggers.py|info|327] [/usr/lib/python3/dist-packages/supervisor/loggers.py|log|345] [/usr/lib/python3/dist-packages/supervisor/loggers.py|emit|227] [/usr/lib/python3/dist-packages/supervisor/loggers.py|doRollover|264])
Мой Dockerfile выглядит так:
FROM debian:bullseye
WORKDIR /app
COPY . /app
COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN apt-get update && apt-get install -y supervisor && apt-get install -y procps
#RUN apt-get install -y python3-pip && pip install supervisor-stdout
CMD ["/usr/bin/supervisord"]
И мой supervisord.conf выглядит так:
[supervisord]
nodaemon=true
[program:program1]
command=/bin/bash /app/process1.sh &
process_name=PROGRAM1
autostart=true
autorestart=true
priority=0
redirect_stderr=true
stdout_logfile=/dev/stdout
stderr_logfile=/dev/stderr
[program:program2]
command=/bin/bash /app/process2.sh &
process_name=PROGRAM2
autostart=true
autorestart=true
priority=0
redirect_stderr=true
stdout_logfile=/dev/stdout
stderr_logfile=/dev/stderr
Что здесь происходит? Есть ли проблема с моей конфигурацией?
Спасибо!
Я узнал, что происходит. Вам нужно указать, что максимальный размер файла журнала равен 0, потому что супервизор не может записать файл в /dev/stdout
.
По каждой программе:
stdout_logfile_maxbytes = 0
stderr_logfile_maxbytes = 0
Вдохновение: https://github.com/Supervisor/supervisor/issues/1412