Вопрос или проблема
Я создал образ из Ubuntu 18 в качестве базового образа.
В нём установлены несколько сервисов, таких как nginx, php-fpm и ssh.
Всё работало, контейнер создавался, я мог получить доступ к контейнеру и ко всему, что связано с контейнером.
Но мне приходилось вручную запускать nginx и php-fpm, заходя в контейнер. Я немного поискал в Google и нашёл supervisor.
Поэтому я добавил скрипты supervisor для автоматического запуска сервисов. Но после добавления supervisor мой контейнер получает выход сразу после создания.
При проверке логов контейнера с помощью команды docker logs container-name
я получаю ошибку:
/usr/lib/python2.7/dist-packages/supervisor/options.py:297:
UserWarning: Supervisord запускается с правами root и ищет
свой конфигурационный файл в местах по умолчанию (включая текущую
рабочую директорию); вероятно, вы хотите указать аргумент “-c”,
указывающий абсолютный путь к конфигурационному файлу для улучшенной
безопасности. ‘Supervisord запускается с правами root и ищет’
В моём Dockerfile код supervisor выглядит так:
RUN apt-get install -y supervisor
.
.
.
.
COPY ./supervisor/supervisord.conf /etc/supervisor/supervisord.conf
COPY ./supervisor/sshd.conf /etc/supervisor/conf.d/sshd.conf
COPY ./supervisor/nginx.conf /etc/supervisor/conf.d/nginx.conf
COPY ./supervisor/php-fpm.conf /etc/supervisor/conf.d/php-fpm.conf
.
.
.
.
CMD supervisord -n -c /etc/supervisor/supervisord.conf
Я много искал в Google и не смог решить проблему. Я буду очень признателен, если кто-нибудь сможет помочь решить эту проблему. Сообщите, если потребуется дополнительная информация.
В вашем supervisord.conf добавьте это:
[supervisord]
nodaemon=true
Это указывает supervisord запускаться в фоновом режиме, а не как сервис. У меня была такая же проблема, но эта строка решила её.
Я взял её здесь.
Ответ или решение
Конечно, я помогу вам разобраться с распространенной проблемой, сталкиваемой при использовании Docker-контейнеров с Supervisor для управления несколькими службами. Разберем, почему возможно преждевременное завершение контейнера и как это предотвратить.
Теория
Docker-контейнеры функционируют на основе идеи выполнения единственной команды или процесса в качестве основного процесса контейнера. Когда данный основной процесс завершается, завершается и контейнер. При использовании Supervisor в качестве этого основного процесса важно обеспечить, чтобы он работал в "недаемонном" режиме — то есть в переднем плане (foreground). Это условие необходимо для того, чтобы контейнер не завершался сразу после запуска.
Применение Supervisor для управления процессами
Supervisor — это система управления процессами для Unix-подобных операционных систем, предназначенная для управления несколькими процессами. Её можно эффективно использовать в Docker-контейнерах для автоматического запуска и мониторинга множества служб, таких как nginx, php-fpm и ssh, в вашем случае.
Проблема и её решение
Основной проблемой, на которую вы наткнулись, является быстрое завершение контейнера после его создания. Причина этого — неверно настроенный режим работы Supervisor, который в текущей конфигурации запускается как демон. Рассмотрим, как с этим справиться по шагам:
Пример конфигурации и применения
-
Файл конфигурации Supervisor:
- В вашем
supervisord.conf
добавьте строкуnodaemon=true
. Это укажет Supervisor работать в переднем плане, что соответствует режиму работы Docker-контейнера. - Проверьте, что все загруженные конфигурационные файлы служб, такие как
sshd.conf
,nginx.conf
, иphp-fpm.conf
, имеют корректные пути и параметры запуска.
Пример конфигурационного файла
supervisord.conf
:[supervisord] nodaemon=true [program:nginx] command=/usr/sbin/nginx [program:php-fpm] command=/usr/sbin/php-fpm7.2 --nodaemonize [program:sshd] command=/usr/sbin/sshd -D
- В вашем
-
Dockerfile:
- Убедитесь, что в Dockerfile путь к конфигурационным файлам Supervisor указан верно.
- Используйте команду
supervisord -n -c /etc/supervisor/supervisord.conf
в качестве CMD, что инициирует запуск Supervisor с указанием вашего файла конфигурации.
RUN apt-get install -y supervisor COPY ./supervisor/supervisord.conf /etc/supervisor/supervisord.conf COPY ./supervisor/sshd.conf /etc/supervisor/conf.d/sshd.conf COPY ./supervisor/nginx.conf /etc/supervisor/conf.d/nginx.conf COPY ./supervisor/php-fpm.conf /etc/supervisor/conf.d/php-fpm.conf CMD ["supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
Применение
После внесения вышеуказанных изменений постройте изображение Docker и запустите контейнер. Используйте команду:
docker build -t your-image-name .
docker run -d --name your-container-name your-image-name
Проверьте логи контейнера, чтобы убедиться, что все службы были запущены корректно. Это можно сделать командой:
docker logs your-container-name
Заключение
Использование Supervisor в Docker-контейнерах позволяет автоматически управлять и контролировать запуск множества служб внутри одного контейнера. Однако важно правильное конфигурирование Supervisor для работы в переднем плане, что обеспечит стабильно работающий контейнер, который не завершится сразу после запуска. Соблюдение этих рекомендаций должно решить вашу проблему с выходом контейнера.
Если у вас возникнут дополнительные вопросы или трудности, не стесняйтесь уточнять и задавать вопросы. Удачи в ваших начинаниях!