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
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
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 DockerfileRUN Befehl so:
RUN echo "exit 0" > /usr/sbin/policy-rc.d
und dann neustarten php-fpm innerhalb eines CMD Befehl
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:
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.
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
14306100cookie-checkWie kann ich php-fpm standardmäßig in einem Docker-Container starten?yes
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