PHP7-FPM Docker CMD приводит к ошибке 502 Nginx

У меня есть докер-компоновка, использующая два контейнера: nginx и php7-fpm. Я создаю php через Dockerfile, и мне нужно, чтобы на нем был установлен cron:

FROM 'php:7-fpm'
# PDO
RUN docker-php-ext-install pdo_mysql
# Cron
RUN apt-get update -q -q && apt-get install -y cron
ADD crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log // this line is breaking things

Таким образом, nginx сообщает об ошибке 502 Bad Gateway. Если я удалю последнюю строку, CMD, все будет работать нормально. Как я могу это исправить?

0
задан 6 March 2018 в 15:43
3 ответа

В контейнере докера вы можете иметь только одну точку входа или команду, выполняемую при запуске контейнера. Если в конце вашего Dockerfile указано:

CMD cron && tail -f /var/log/cron.log

Это означает, что единственная команда, которая будет запущена, - это cron. Таким образом, ваша начальная точка входа для службы php-fpm становится неактуальной. Чтобы запустить несколько процессов в контейнере докера, вы должны использовать сценарий-оболочку или супервизор. Для сценария-оболочки напишите его и скопируйте в процессе сборки. В сценарии должны быть команды запуска для всех ваших служб.

CMD будет иметь что-то вроде:

CMD ./wrapper_script.sh

Для супервизора в Интернете доступны хорошие учебные пособия, в которых объясняется, как использовать супервизор с докером.

Ваш Dockerfile будет выглядеть вот так:

FROM 'php:7-fpm'
# PDO
RUN docker-php-ext-install pdo_mysql
# Cron
RUN apt-get update -q -q && apt-get install -y cron supervisor
ADD crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN touch /var/log/cron.log
ADD supervisord.conf /etc/supervisor.conf
ENTRYPOINT ["/usr/bin/supervisord -c /etc/supervisor.conf"]

Затем создайте файл supervisord.conf:

[supervisord]
nodaemon=true

[program:php-fpm]
command=php-fpm-commands

[program:cron]
command=cron-commands

Замените команды php-fpm и cron командами и параметрами, которые вам нужны для каждой службы.

0
ответ дан 5 December 2019 в 06:23

Я также столкнулся с тем же вопросом при использовании докера с php-fpm и nginx . Способ решения проблемы был аналогичен ответу, данному ранее.

TL; DR

FROM 'php:7-fpm'
# PDO
RUN docker-php-ext-install pdo_mysql
# Cron
RUN apt-get update -q -q && apt-get install -y cron
ADD crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN touch /var/log/cron.log
CMD cron && docker-php-entrypoint php-fpm

Добавление последней строки для запуска процесса, который php-fpm намеревался запускать


Как указано выше,

В контейнере Docker у вас может быть только одна точка входа или команда, выполняемая при запуске контейнера.

Проблема

Но когда вы добавляете нашу собственную точку входа в контейнер докеров, выполнив CMD ["custom_script.sh"] или ENTRYPOINT ["custom_script.sh"] , сценарий точки входа по умолчанию заменяется вашим пользовательским (в нашем случае custom_script.sh ).

Я нашел решение проблемы, написав сценарий таким образом, чтобы он не заменял оригинал, а расширял его.

Решение

  • Чтобы узнать, какой сценарий запускает контейнер докеров по умолчанию, было найдено с помощью docker-compose ps после запуска контейнера без сценария точки входа.Результат на моей машине выглядит следующим образом:
                Name                              Command               State                Ports              
----------------------------------------------------------------------------------------------------------------
appointmentlaravel_appointment_app_1   docker-php-entrypoint php-fpm    Up      0.0.0.0:9007->6001/tcp, 9000/tcp

Как видите, по умолчанию запускается контейнер сценария docker-php-entrypoint php-fpm так.

  • Мы можем создать собственный сценарий таким образом, чтобы в конце выполнялся тот же сценарий, что и изначально, как показано ниже;
# arbitary code to run when docker-container starts

docker-php-entrypoint php-fpm

В вашем случае файл докеров может выглядеть так:

FROM 'php:7-fpm'
# PDO
RUN docker-php-ext-install pdo_mysql
# Cron
RUN apt-get update -q -q && apt-get install -y cron
ADD crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN touch /var/log/cron.log
CMD cron && docker-php-entrypoint php-fpm

Посмотрите, как я заменил последнюю строку вашего файла докеров на запуск docker-php-entrypoint php-fpm .

1
ответ дан 7 February 2020 в 14:40

user460778 правильный ответ, здесь может быть только точка входа для контейнера это должен быть сервис php-fpm, поэтому вам нужно запустить crons от супервизора. Мой файл супервизора выглядит следующим образом

[supervisord]
nodaemon=true

[program:php-fpm]
command = /usr/local/sbin/php-fpm
autostart=true
autorestart=true

[program:cron]
autorestart=false
command=cron -f
-1
ответ дан 15 October 2020 в 09:40

Теги

Похожие вопросы