2016-05-19 15 views
5

Ho questa immagine Docker -Come posso avviare php-fpm in un contenitore Docker per impostazione predefinita?

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"] 

Fondamentalmente, io voglio così che inizia php-fpm quando il contenitore finestra mobile si avvia. Ho php-fpm funzionante se vado manualmente nel contenitore e lo accendo con /usr/sbin/php-fpm.

L'ho provato all'interno del mio file ansible con questo comando (non ha funzionato). Ho provato ad utilizzare il modulo di servizio e senza luck.-

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

Come posso avere in funzione php-fpm insieme con Apache?

+0

Aggiungi un 'RUN/usr/sbin/php-fpm'? – Shanoor

+0

Nessun dado. Non si avvia ancora una volta avviato il contenitore. –

risposta

7

Si dovrebbe usare supervisor al fine di avviare una serie di servizi

Nella tua dockerfile, installare supervisore, poi si lancia

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

E il tuo docker/supervisord.conf contiene tutti i servizi che si desidera avviare, in modo da poter avere qualcosa di simile che

[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 

ovviamente si deve adattare con le versioni percorso e php-fpm e propri servizi (nginx nel mio esempio, apache per te ecc.), ma fondamentalmente il supervisore è il modo migliore per gestire l'avvio di diversi servizi da un punto di partenza.

Qui potete trovare il documento ufficiale della finestra mobile circa supervisore

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

+1

Anche se questo metodo sembra funzionare, sembra eccessivo per il solo servizio aggiuntivo che è necessario avviare. È possibile fare qualcosa come catena del mio CMD insieme, o avviarlo quando il contenitore Docker viene inizializzato? –

+0

Un'altra opzione è eseguire php-fpm in un altro contenitore e mettere i due contenitori sulla stessa rete. Quindi puntare la configurazione httpd php-fpm nell'altro contenitore. – Matt

+1

Non trovo davvero eccessivo questo metodo, il supervisore è un modo comune per gestire la gestione di più processori e il modo consigliato dalla finestra mobile, è solo il file del docker che cambierà un bit e un altro file di configurazione. Il tuo contenitore sarà più flessibile se desideri aggiungere alcuni servizi in un secondo momento. Ma se trovi un metodo "legit" più facile, faccelo sapere, mi interessa – olibiaz

1

Io uso rc.local per avviare i servizi all'interno di un contenitore, e quindi eseguire un comando all'interno di quel contenitore per eseguire rc.local. Quindi, ecco un comando di esempio di esecuzione:

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" 

E questo è uno dei file rc.local da/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 

Quello che fa è lanciare un contenitore denominato "myContainer" utilizzando questa immagine "myimage/name "con le porte 80 e 443 esposte. Una volta lanciato chiama mysql, php5-fpm e nginx per l'avvio, facendo una pausa tra ciascuno per 5 secondi. In questo modo è possibile chiamare qualsiasi servizio da avviare che si desidera eseguire all'interno del contenitore. Ricorda però di aggiungere porte aperte per questi servizi.

Questo comando di esecuzione aggiungerà "Hello World" nel file di registro ogni 100 secondi come un "impulso" che consente di sapere quando era in esecuzione e quando è stato arrestato.

3

Ho avuto bisogno di cose simili di recente. Per le immagini di alpine è sufficiente eseguire sia php-fpm sia un server Web come comando contenitore. Definito in Dockerfile un po 'come questo:

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

ie. daemonizzare php-fpm e quindi eseguire nginx in primo piano.

On ubuntu/debian immagini c'è anche necessario consentire partire pacchetti installati di recente eseguendo un comando DockerfileRUN come questo:

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

e quindi riavviare il php-fpm all'interno di un comando CMD

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

Altro su policy-rc.d da trovare in this askubuntu question

0

Sono venuto qui cercando come eseguire php-fpm in primo piano in modo che potesse essere PID 1 in un contenitore di finestra mobile. La soluzione è

php-fpm -F -R 

Spiegazione

Possiamo controllare le opzioni disponibili con php-fpm --help

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

Se si esegue php-fpm in un contenitore finestra mobile, c'è una buona probabilità che si sta eseguendo il processo come root. php-fpm non parte come root, senza una bandiera in più:

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