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