Laut offizieller Dokumentation:
Es kann nur einen CMD
geben Anweisung in einem Dockerfile . Wenn Sie mehr als einen CMD
angeben dann nur die letzten CMD
wird wirksam.
Und Ihr Dockerfile hat zwei CMD-Befehle, also den Befehl php-fpm
überschreibt
/usr/bin/supervisord
Damit Sie PHP-Befehle ausführen können, aber den im Container erstellten Supervisor-Socket nicht finden können.
Sie können Ihr Problem beheben, indem Sie die letzten CMD
löschen Befehl im Zusammenhang mit PHP-FPM
wie Sie Supervisor bereits konfiguriert haben um es zu starten und Ihr Dockerfile sollte einen CMD
haben Befehl:
CMD ["/usr/bin/supervisord"]
Die Idee dabei ist, den Supervisor zu eliminieren und stattdessen das auszuführen, was der Supervisor früher in mehreren verschiedenen Containern ausgeführt hat. Sie können dies ganz einfach mit docker-compose
orchestrieren , beispielsweise alle, die denselben Container mit unterschiedlichem CMD
ausführen Überschreibungen oder derselbe Container mit einem anderen CMD
Schicht am Ende, um es aufzuteilen. Das Problem dabei ist, dass der Supervisor Docker den Status der von ihm verwalteten Prozesse nicht mitteilen kann. Es wird immer "lebendig" sein, auch wenn alle seine Prozesse vollständig zerstört sind. Wenn Sie diese direkt aufdecken, können Sie sehen, dass sie abgestürzt sind.
Am besten teilen Sie jeden dieser Dienste in separate Container auf. Da es offiziell vorgefertigte für MySQL und so weiter gibt, gibt es wirklich keinen Grund, selbst einen zu bauen. Was Sie tun möchten, ist diesen supervisord
zu übersetzen config auf docker-compose
formatieren.
Mit separaten Containern können Sie Dinge wie docker ps
tun Um zu sehen, ob Ihre Dienste korrekt ausgeführt werden, werden sie alle einzeln aufgelistet. Wenn Sie einen aktualisieren müssen, können Sie das ganz einfach tun, Sie arbeiten einfach mit diesem einen Container, anstatt das Ganze herunterziehen zu müssen.
Die Art und Weise, wie Sie es hier angreifen, behandelt Docker wie eine ausgefallene VM, was es wirklich nicht ist. Was es stattdessen ist, ist ein Prozessmanager , wo diese Prozesse zufällig vorgefertigte Disk-Images und eine Sicherheitsschicht um sie herum haben.
Stellen Sie Ihre Umgebung aus einzelnen Prozesscontainern zusammen und Ihr Leben wird viel einfacher, sowohl aus Wartungs- als auch aus Überwachungssicht.
Wenn Sie diese Konfiguration als etwas docker-compose
ausdrücken können umgehen können, dann sind Sie dem Umstieg auf eine anspruchsvollere Verwaltungsebene wie Kubernetes einen Schritt näher gekommen, was die logische Schlussfolgerung dieser speziellen Migration sein könnte.