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?
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
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 Dockerfile
RUN
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
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
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)
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é.
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.
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 -R
https://engineeringblog.Yelp.com/2016/01/dumb-init-an-init- for-docker.html