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

У меня есть это изображение 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,

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

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

Как мне запустить php-fpm вместе с apache?

8

Решение

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

В вашем dockerfile установите supervisor, затем вы запустите

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

Конечно, вы должны адаптироваться к вашим путям и версиям php-fpm и вашим сервисам (nginx в моем примере, apache для вас и т. Д.), Но в сущности супервизор — лучший способ управлять запуском нескольких сервисов из одной стартовой точки.

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

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

8

Другие решения

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

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

то есть. демонизировать php-fpm а потом беги nginx на переднем плане.

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

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 быть найденным в этом вопросе аскубунту

6

Я пришел сюда в поисках как бежать 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)
5

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

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.local из / 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 секунд в виде «импульса», который сообщит вам, когда он был запущен и когда он был остановлен.

1

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

использовать тупой инициал

Я смог прокси 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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector