https://smarden.org/runit/ Supervisor это конечно здорово. Но он на пайтоне и весьма прожорливый. Меняем первичную стратегию на runit. /etc/sv/symfony-consumer/run #!/bin/sh

#Перенаправляем вывод ошибок в стандартный вывод для svlogd

exec 2>&1

#Переходим в корневую директорию проекта Symfony

cd /var/www/my-symfony-project || exit 1

#Указываем переменные окружения, если это необходимо

export APP_ENV=prod

#Запускаем consumer через exec от имени менее привилегированного пользователя (например, www-data) #Флаг --limit=100 остановит воркер после 100 сообщений (защита от утечек памяти), runit его тут же перезапустит

exec chpst -u www-data:www-data php bin/console messenger:consume async --limit=100 --memory-limit=128M

/etc/sv/symfony-consumer/log/run (логирование, с ротацией логов) #!/bin/sh

#Создаем директорию для логов, если её нет

mkdir -p /var/log/symfony-consumer

#Запускаем утилиту логирования svlogd

exec svlogd -tt /var/log/symfony-consumer

Не забываем внутри контейнера сделать ln -s /etc/sv/symfony-consumer /etc/service/

После этого runit автоматически обнаружит и запустит наш новый сервис.

Следующим шагов остается настроить правильный перезапуск всего контейнера с runit во время релиза новой версии образа докер.