Docker-контейнеры завершают работу из-за супервизора.

Вопрос или проблема

Я создал образ из 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, который в текущей конфигурации запускается как демон. Рассмотрим, как с этим справиться по шагам:

Пример конфигурации и применения

  1. Файл конфигурации 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
  2. 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 для работы в переднем плане, что обеспечит стабильно работающий контейнер, который не завершится сразу после запуска. Соблюдение этих рекомендаций должно решить вашу проблему с выходом контейнера.

Если у вас возникнут дополнительные вопросы или трудности, не стесняйтесь уточнять и задавать вопросы. Удачи в ваших начинаниях!

Оцените материал
Добавить комментарий

Капча загружается...