Как запустить php-fpm в контейнере Docker по умолчанию?

у меня есть это изображение Докера -

FROM centos:7
MAINTAINER Me <me.me>
RUN yum update -y
RUN yum install -y git https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

RUN yum install -y ansible
RUN git clone https://github.com/.../dockerAnsible.git
RUN ansible-playbook dockerFileBootstrap.yml
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); 
rm -f /lib/systemd/system/multi-user.target.wants/*;
rm -f /etc/systemd/system/*.wants/*;
rm -f /lib/systemd/system/local-fs.target.wants/*; 
rm -f /lib/systemd/system/sockets.target.wants/*udev*; 
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; 
rm -f /lib/systemd/system/basic.target.wants/*;
rm -f /lib/systemd/system/anaconda.target.wants/*;

VOLUME [ "/sys/fs/cgroup" ]
EXPOSE 80 443 3306

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

В принципе, я хочу, чтобы php-fpm запускался при запуске контейнера docker. У меня работает php-fpm, если я вручную зайду в контейнер и включу его с помощью /usr/sbin/php-fpm.

я попробовал это внутри моего файла ansible с этой командой (это не сработало). Я пробовал использовать сервисный модуль, а также не повезло.-

 - name: Start php fpm
   command: /usr/sbin/php-fpm

как я могу иметь php-fpm работает вместе с apache?

5 ответов


вы должны использовать supervisor для того чтобы запустить несколько сервисов

в вашем dockerfile установите супервизор, затем запустите

COPY ./docker/supervisord.conf /etc/supervisord.conf
....
CMD ["/usr/bin/supervisord", "-n"]

и свой docker/supervisord.conf содержит все службы, которые вы хотите запустить, так что вы можете иметь что-то вроде этого

[program:php-fpm]
  command=/opt/remi/php70/root/usr/sbin/php-fpm -c /etc/php-fpm.conf
  ;command=/usr/sbin/php70-fpm -c /etc/php-fpm.d
  stdout_logfile=/dev/stdout
  stdout_logfile_maxbytes=0
  stderr_logfile=/dev/stderr
  stderr_logfile_maxbytes=0

[program:nginx]
  command=/usr/sbin/nginx
  stdout_logfile=/dev/stdout
  stdout_logfile_maxbytes=0
  stderr_logfile=/dev/stderr
  stderr_logfile_maxbytes=0

конечно, вы должны адаптироваться с вашими версиями path и php-fpm и вашими службами (nginx в моем примере, apache для вас и т. д...), но в основном supervisor-лучший способ управлять началом нескольких услуги с одной начальной точки.

здесь вы можете найти официальный документ докера о супервизоре

https://docs.docker.com/engine/admin/using_supervisord/


мне нужна была подобная вещь в последнее время. Для альпийские Linux изображений достаточно для запуска обоих php-fpm и веб-сервер в качестве команды контейнера. Определено в Dockerfile примерно так:

CMD /usr/bin/php-fpm -D; nginx

ie. для демонизации php-fpm и затем запустить nginx на переднем плане.

On ubuntu / debian изображения там также необходимо разрешить запуск недавно установленных пакетов, запустив Dockerfile как это:

RUN echo "exit 0" > /usr/sbin/policy-rc.d

и перезапустите php-fpm внутри CMD команда

CMD /etc/init.d/php7.0-fpm restart && nginx -g "daemon off;"

подробнее о policy-rc.d можно найти в этом вопросе askubuntu


Я пришел сюда в поисках, как бежать php-fpm на переднем плане, чтобы это мог быть PID 1 в контейнере докера. Решение

php-fpm -F -R

объяснение

мы можем проверить доступные варианты с php-fpm --help

-F, --nodaemonize 
      force to stay in foreground, and ignore daemonize option from config file

если вы используете php-fpm в контейнере docker есть хороший шанс, что вы запускаете процесс как root. php-fpm не запускается как root без дополнительного флага:

  -R, --allow-to-run-as-root
        Allow pool to run as root (disabled by default)

Я использую rc.локальный для запуска служб внутри контейнера, а затем выполните команду внутри этого контейнера для выполнения rc.местный. Вот пример команды запуска:

sudo docker run --restart=always -itd --name mycontainer -p 80:80 -p 443:443 myimage/name /bin/bash -c "/etc/rc.local && while true; do echo hello world; sleep 100; done"

и это один из rc.локальные файлы из /etc

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sleep 5
service mysql start
sleep 5
service php5-fpm start
sleep 5
service nginx start
exit 0

это запуск контейнера под названием " mycontainer "с использованием изображения" myimage/name " с открытыми портами 80 и 443. После запуска он вызывает mysql, php5-fpm и nginx для запуска, делая паузу между каждым в течение 5 секунд. В этом способ, которым вы можете вызвать любую службу для запуска, которую вы хотите запустить внутри этого контейнера. Не забудьте добавить открытые порты для этих служб.

эта команда запуска также добавит " Hello World "в ваш файл журнала каждые 100 секунд в качестве" импульса", который даст вам знать, когда он работал и когда он был остановлен.


Я считаю, что ответ @ckeeney выше может быть принят как правильный ответ, но я не смог заставить его работать с моим конкретным случаем.

использовать dumb-init

я смог прокси PID1 через dumb-init и демонизировать PHP-FPM со следующей командой:dumb-init /usr/sbin/php-fpm7.2 -F -R https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html