web-dev-qa-db-fra.com

Comment démarrer php-fpm dans un conteneur Docker par défaut?

J'ai cette image de 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"]

En gros, je le veux pour que php-fpm commence quand le conteneur docker démarre. Je travaille avec php-fpm si je vais manuellement dans le conteneur et l'allume avec /usr/sbin/php-fpm

Je l'ai essayé à l'intérieur de mon fichier ansible avec cette commande (cela n'a pas fonctionné). J'ai aussi essayé d'utiliser le module de service sans aucune chance.-

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

Comment puis-je faire fonctionner php-fpm avec apache?

8
J. Doe

Vous devez utiliser supervisor pour lancer plusieurs services.

Dans votre fichier docker, installez le superviseur, puis lancez

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

Et votre docker/supervisord.conf contient tous les services que vous voulez démarrer, vous pouvez donc avoir quelque chose comme ça

[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

Bien sûr, vous devez vous adapter avec vos versions de path et php-fpm et de vos services (nginx dans mon exemple, Apache pour vous, etc.), mais fondamentalement, superviseur est le meilleur moyen de gérer le début de plusieurs services à partir d'un point de départ.

Ici vous pouvez trouver le doc officiel de docker sur supervisor

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

8
olibiaz

J'ai eu besoin de la même chose récemment. Pour les images Alpine linux, il suffisait d'exécuter php-fpm et un serveur Web en tant que commande de conteneur. Défini dans Dockerfile un peu comme ceci:

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

c'est à dire. démoniser php-fpm et ensuite exécuter nginx au premier plan.

Sur les images ubuntu/debian, il est également nécessaire de lancer allow à partir des packages récemment installés en exécutant une commande DockerfileRUN comme celle-ci:

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

puis redémarrez le php-fpm dans une commande CMD

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

Plus sur policy-rc.d à trouver dans cette question askubuntu

6
helvete

Je suis venu ici pour savoir comment exécuter php-fpm au premier plan afin que ce soit le PID 1 dans un conteneur de menu fixe. La solution est

php-fpm -F -R

Explication

Nous pouvons vérifier les options disponibles avec php-fpm --help

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

Si vous exécutez php-fpm dans un conteneur Docker, il est fort probable que vous exécutiez le processus en tant que root. php-fpm ne démarrera pas en tant que root sans indicateur supplémentaire:

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

J'utilise rc.local pour démarrer des services dans un conteneur, puis j'exécute une commande à l'intérieur de ce conteneur pour exécuter rc.local. Alors, voici un exemple de commande d'exécution:

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"

Et ceci est l’un des fichiers rc.local de/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

Cela permet de lancer un conteneur appelé "mycontainer" en utilisant l'image "myimage/name" avec les ports 80 et 443 exposés. Une fois lancé, il appelle mysql, php5-fpm et nginx pour démarrer, une pause de 5 secondes entre chacun. De cette manière, vous pouvez appeler n'importe quel service que vous souhaitez exécuter à l'intérieur de ce conteneur. N'oubliez pas d'ajouter des ports ouverts pour ces services.

Cette commande d'exécution ajoutera également "Hello World" à votre fichier journal toutes les 100 secondes en tant que "Pulse" vous permettant de savoir quand il était en cours d'exécution et quand il a été arrêté.

1
Gavin Tremlor

Je pense que la réponse de @ ckeeney ci-dessus pourrait être acceptée comme étant la bonne réponse, mais je n’étais pas en mesure de la faire fonctionner avec mon cas particulier.

utiliser dumb-init

J'ai pu envoyer un proxy à PID1 via dumb-init et démoniser PHP-FPM avec la commande suivante: dumb-init /usr/sbin/php-fpm7.2 -F -Rhttps://engineeringblog.Yelp.com/2016/01/dumb-init-an-init- for-docker.html

0
bxbxckx