
Ich baue einen Docker-Container, der Informationen zum Systemstatus auf einer Webseite anzeigen soll.
Ich habe einen PHP-fpm- und NGINX-Container am Laufen. Wenn ich shell_exec
oder verwende exec
, wird das von mir erstellte .sh-Skript gefunden und ausgeführt.
hddtemp
Die Ausgabe von und wird jedoch nicht angezeigt (lm-)sensors
. Höchstwahrscheinlich, weil diese im PHP-Container nicht vorhanden sind.
Wie lässt sich das Problem richtig beheben?
- Mein Kollege meinte, dass unter Linux „alles eine Datei ist“, aber ich nehme nicht an, dass ich diese Anwendungen einfach in den PHP-FPM-Container einbinden und erwarten kann, dass sie funktionieren. Es klingt auch ziemlich nach Hack und der PHP-FPM-Container ist möglicherweise nicht dasselbe Betriebssystem, erfüllt nicht die Anforderungen oder ich kann das „Sensor-Setup“ nicht ausführen.
- Natürlich könnte ich diese Apps auf dem Hauptbetriebssystem ausführen, die Ergebnisse von Zeit zu Zeit in eine Datei schreiben und diese in den Container einbinden. Aber auch das macht den Zweck von Docker zunichte.
- Ich nehme an, ich könnte meine eigene Version von PHP-fpm erstellen, aber das würde bedeuten, dass ich diese jedes Mal neu erstellen müsste, wenn es ein Update für PHP gibt? Das klingt auch ein bisschen nach einem Hack.
Was wäre also die richtige Vorgehensweise (es muss keine der oben genannten Möglichkeiten sein)?
Derzeit habe ich die folgende „funktionierende Lösung“:
(Docker-Komposition)
php:
image: php:7-fpm
privileged: true
volumes:
- /usr/sbin/hddtemp:/usr/sbin/hddtemp
- /etc/hddtemp.db:/etc/hddtemp.db
(PHP)
var_dump(shell_exec("/usr/sbin/hddtemp /dev/sda 2>&1"));
In diesem Fall muss ich PHP jedoch im Docker im „privilegierten“ Modus ausführen. Ich habe das Gefühl, dass das falsch ist, aber es muss auf die Diskinfo zugegriffen werden?
Antwort1
Es sind nicht die Befehle, die fehlen. Sie können Kopien der Befehle in den Container legen. Oder etwas Äquivalentes. Was fehlt, ist der Zugriff auf die Informationen, die sie benötigen.
Sie können dies durch Einhängen /proc
vom Host in den Container hinzufügen.Seien Sie vorsichtig, da dies die gesamte Isolierung aufheben wird. Möglicherweise können Sie es schreibgeschützt mounten und hidepid=2 setzen. Möglicherweise gibt es auch andere Optionen.