Ich möchte während des Docker-Builds einen Dienst starten. Ich brauche diesen Dienst nicht, um weiter zu laufen, nachdem der Build-Prozess notwendigerweise beendet wurde (oder ich weiß, dass ich den CMD-Befehl dafür verwenden kann), aber ich brauche ihn lange genug, um einen zweiten Befehl auszuführen, der darauf angewiesen ist, dass dieser Dienst läuft und läuft.Starten eines Dienstes während des Docker-Builds
Um genauer zu sein, ich versuche, eine Dockerfile für den ejabberd XMPP Server zu schreiben, der auch ein Modul für diesen Server installiert. Ich versuche, den ejabberd-Server mit ejabberdctl start zu starten und dann das Modul mit dem ejabberdctl module_install-Dienstprogramm zu installieren, das davon abhängt, dass der Knoten ausgeführt wird. Es sieht wie folgt aus:
RUN ejabberdctl start && ejabberdctl modules_update_specs && ejabberdctl module_install ejabberd_auth_http
Jetzt habe ich auf ein Problem stoßen, und ich kam mit zwei mögliche Ursachen auf. Das Problem ist, dass mein Build ab dieser Zeile nicht funktioniert, da der Knoten inaktiv ist, wenn der zweite Befehl ausgeführt wird. Ich erhalte den folgenden Fehler, die ein typischer ist, wenn Sie versuchen, das ejabberdctl Dienstprogramm zu verwenden, ohne den Knoten zu sein bis tatsächlich:
fehlgeschlagen RPC-Verbindung zu dem Knoten ejabberd @ localhost
Der Befehl ‚/ bin/sh -c ejabberdctl starten & & ejabberdctl modules_update_specs & & ejabberdctl module_install ejabberd_auth_http‘einen nicht-Null-Code zurückgegeben: 3
Dies könnte entweder weil das starten des se rvice dauert etwas länger als für die Ausführung des zweiten Befehls erforderlich ist, sodass der zweite Befehl in einen Knoten läuft, der gerade gestartet wird. Ich bin mir nicht sicher, wie wahrscheinlich das ist. Die zweite Ursache könnte sein, dass das Starten eines Dienstes, der von init.d abhängt, während des Buildprozesses nicht in Docker funktioniert.
Ich baue den Container bis zu dieser Zeile, die das Problem verursacht, in den Container eingegeben und die Befehle manuell ausgeführt und alles funktioniert wie es sollte.
Also zusammenfassend möchte ich den ejabberd-server während des Builds starten und dann sein Control-Dienstprogramm verwenden, um einige Sachen zu installieren. Eine letzte Option wäre, das Modul manuell zu installieren, ohne dass der Server läuft, aber ich würde es lieber mit dem ejabberdctl-Steuerprogramm machen.
, warum Sie nicht, indem Sie einfach einen Schlaf testen Sie Ihre Hypothese ? } 'ejabberdctl start && sleep 10 && ejabberdctl modules_update_specs && ejabberdctl modul_install ejabberd_auth_http'? –
Und Sie können die zweite Hypothese testen, indem Sie einfach eine Zeile mit 'ejabberdctl start' haben und sehen, ob sie fehlschlägt. –
Die erste Version mit 'sleep 10' hat es geschafft! Das Modul wurde erfolgreich installiert, es war also ein Zeitproblem. Gibt es eine schönere Art, das zu beheben als Schlaf? Ich sah einige Lösungen für ein externes Shellskript, das nach dem Start des Dienstes ausgeführt wird und in einer Schleife läuft, bis es den Prozess in der Prozessliste findet. Nicht sicher, ob das nicht ein bisschen viel ist .. – melaniejb