Wie kann ich php-fpm standardmäßig in einem Docker-Container starten?

Lesezeit: 7 Minuten

Ich habe dieses Docker-Image –

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

Grundsätzlich möchte ich, dass php-fpm startet, wenn der Docker-Container startet. Ich habe php-fpm, das funktioniert, wenn ich manuell in den Container gehe und es mit einschalte /usr/sbin/php-fpm.

Ich habe es mit diesem Befehl in meiner Ansible-Datei versucht (es hat nicht funktioniert). Ich habe auch erfolglos versucht, das Servicemodul zu verwenden.

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

Wie kann ich php-fpm zusammen mit Apache laufen lassen?

  • Füge hinzu ein RUN /usr/sbin/php-fpm?

    – Shanuor

    19. Mai 2016 um 4:13 Uhr

  • Kein Würfel. Es startet immer noch nicht, wenn der Container damit gestartet wird.

    – J. Reh

    19. Mai 2016 um 4:37 Uhr

Du solltest benutzen supervisor um mehrere Dienste zu starten

Installieren Sie in Ihrer Dockerdatei Supervisor, dann starten Sie

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

Und dein docker/supervisord.conf enthält alle Dienste, die Sie starten möchten, damit Sie so etwas haben können

[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

Natürlich sollten Sie Ihren Pfad und Ihre php-fpm-Versionen und Ihre Dienste (nginx in meinem Beispiel, Apache für Sie usw.) anpassen, aber im Grunde ist Supervisor der beste Weg, um den Start mehrerer Dienste von einem Startpunkt aus zu verwalten.

Hier finden Sie das offizielle Dokument von Docker zum Thema Supervisor

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

  • Während diese Methode so aussieht, als würde sie funktionieren, scheint es für nur den einen zusätzlichen Dienst, den ich starten muss, ein Overkill zu sein. Ist es möglich, meine CMDs miteinander zu verketten oder sie zu starten, wenn der Docker-Container initialisiert wird?

    – J. Reh

    19. Mai 2016 um 6:20 Uhr

  • Eine andere Möglichkeit besteht darin, php-fpm in einem anderen Container auszuführen und die beiden Container in dasselbe Netzwerk zu stellen. Richten Sie dann die php-fpm httpd-Konfiguration auf den anderen Container.

    – Matt

    19. Mai 2016 um 11:07 Uhr


  • Ich finde diese Methode nicht wirklich übertrieben, Supervisor ist ein üblicher Weg, um die Verwaltung mehrerer Prozessoren zu handhaben, und der empfohlene Weg von Docker, es ist nur Ihre Docker-Datei, die sich ein wenig ändert, und eine weitere Konfigurationsdatei. Ihr Container wird flexibler, wenn Sie später einige Dienste hinzufügen möchten. Aber wenn Sie eine einfachere “legitime” Methode finden, lassen Sie es uns bitte wissen, ich bin interessiert

    – olibiaz

    19. Mai 2016 um 14:33 Uhr

  • Vorzuschlagen, eine weitere Komplexitätsebene hinzuzufügen, ist keine gute Antwort. Abwertung.

    – Nullen und Einsen

    17. Oktober 2017 um 23:55 Uhr

  • Wir sollten bedenken, dass Container heutzutage tatsächlich für einen einzigen Dienst ausgelegt sind. Aus dieser Perspektive ist diese Antwort legitim.

    – fschuindt

    10. März 2019 um 1:36 Uhr

Ich kam hierher, um zu wissen, wie man läuft php-fpm im Vordergrund, also könnte es PID 1 in einem Docker-Container sein. Die Lösung ist

php-fpm -F -R

Erläuterung

Wir können die verfügbaren Optionen mit überprüfen php-fpm --help

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

Wenn Sie laufen php-fpm In einem Docker-Container besteht eine gute Chance, dass Sie den Prozess als Root ausführen. php-fpm startet nicht als root ohne ein zusätzliches Flag:

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

  • Hallo, ist es sicher, php-fpm als root auszuführen? ich bin besorgt

    – Dylan B

    22. Januar 2019 um 7:05 Uhr

  • Diese Antwort gilt nur für die Ausführung von php-fpm in einer containerisierten Umgebung. Wenn Sie Docker oder einen anderen Container nicht verwenden, erhöht das Ausführen von php-fpm als root Ihre Anfälligkeit für Hacker erheblich.

    – ckeeny

    23. Januar 2019 um 8:51 Uhr

  • Dieser Befehl funktioniert nicht in einer Dockerfile, was der Anwendungsfall für diese Antwort ist.

    – Andreas Köster

    7. Dezember 2021 um 20:20 Uhr


  • Ich habe dies am Ende eines Bash-Startskripts verwendet, damit ich viele benutzerdefinierte Konfigurationen vornehmen konnte. Das -R ist allerdings etwas beängstigend. Wenn Sie mit dem offiziellen Basis-Image arbeiten, sollte es als www-data ausgeführt werden.

    – Drosselkopf

    28. September um 1:19 Uhr

Ich brauchte vor kurzem etwas ähnliches. Zum alpin Linux-Images genügte es, beide auszuführen php-fpm und einen Webserver als Containerbefehl. Definiert in Dockerfile ungefähr so:

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

dh. zu dämonisieren php-fpm und dann laufen nginx im Vordergrund.

An ubuntu/debian Bilder gibt es auch notwendig ermöglichen Kürzlich installierte Pakete starten, indem Sie a ausführen Dockerfile RUN Befehl so:

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

und dann neustarten php-fpm innerhalb eines CMD Befehl

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

Mehr dazu policy-rc.d gefunden werden in dieser Askubuntu-Frage

  • Mein einfacher Freund, der 3. funktionierte perfekt. Vielen Dank. 🙂

    – Wir sind Borg

    24. Januar 2020 um 8:43 Uhr

Sie finden diese Konfiguration möglicherweise nützlich, wenn Sie sie ausführen möchten php-fpm und Apache (normalerweise mit MPM Event) im selben Container:

[supervisord]

[program:php-fpm]
command=php-fpm -F -R
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:apachectl]
command=apachectl -D "FOREGROUND" -k start
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

Ich verwende rc.local, um Dienste in einem Container zu starten, und führe dann einen Befehl in diesem Container aus, um rc.local auszuführen. Hier ist ein Beispiel für einen Ausführungsbefehl:

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"

Und das ist eine der rc.local-Dateien von /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

Dadurch wird ein Container namens „mycontainer“ gestartet, der das Image „myimage/name“ mit den exponierten Ports 80 und 443 verwendet. Nach dem Start ruft es zum Starten mysql, php5-fpm und nginx auf und macht jeweils 5 Sekunden Pause. Auf diese Weise können Sie jeden Dienst zum Starten aufrufen, den Sie in diesem Container ausführen möchten. Denken Sie jedoch daran, offene Ports für diese Dienste hinzuzufügen.

Dieser Ausführungsbefehl fügt außerdem alle 100 Sekunden „Hello World“ als „Impuls“ in Ihre Protokolldatei ein, der Sie darüber informiert, wann er ausgeführt und wann er gestoppt wurde.

Ich glaube, die obige Antwort von @ckeeney könnte als die richtige Antwort akzeptiert werden, aber ich konnte sie in meinem speziellen Fall nicht zum Laufen bringen.

Benutze dumm-init

Ich war in der Lage, PID1 über dumb-init zu proxieren und PHP-FPM mit dem folgenden Befehl zu daemonisieren: dumb-init /usr/sbin/php-fpm7.2 -F -R
https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html

Benutzeravatar von Andrey K
Andrej K

Dies funktioniert bei mir auf Docker mit Ubuntu 20.04 mit nginx und php-fpm.

CMD /etc/init.d/php7.4-fpm start -F && nginx -g "daemon off;"

Es sind keine Supervisoren oder Cron-Jobs erforderlich.

  • Ich würde auch vorschlagen, eine zu machen ARG phpver=7.4 und dann verallgemeinere es so RUN cp /etc/init.d/php${phpver}-fpm /etc/init.d/php-fpm. Dann fügst du hinzu CMD /etc/init.d/php-fpm start -F && nginx -g "daemon off;". In Zukunft können Sie die PHP-Version von der ARG-Zeile aus ändern.

    – Dimitar Atanasov

    29. Juli um 12:52 Uhr


1430610cookie-checkWie kann ich php-fpm standardmäßig in einem Docker-Container starten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy