2017-04-13 4 views
4

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.

+0

, 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'? –

+0

Und Sie können die zweite Hypothese testen, indem Sie einfach eine Zeile mit 'ejabberdctl start' haben und sehen, ob sie fehlschlägt. –

+0

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

Antwort

0

Diese *ctl Programme sind in der Regel mit einigen Dienstprogrammen zum Starten/Stoppen/Überwachen des Status des Dienstes verfügbar.

Wenn Ihr Fall Ich denke, die beste Idee, einen einfachen Bash-Skript haben, ist, dass Sie bei der Erstellung ausgeführt werden können, das dies tut:

  • Start ejabberd
  • den Status in Abständen
  • , wenn der Monitor Status des Prozesses liegt, führen Sie Ihren Befehl

Blick auf diese:

 
[email protected]:/# ejabberdctl status 
Failed RPC connection to the node [email protected]: nodedown 
[email protected]:/# echo $? 
3 
[email protected]:/# ejabberdctl start 
[email protected]:/# echo $? 
0 
[email protected]:/# ejabberdctl status 
The node [email protected] is started with status: started 
ejabberd 16.01 is running in that node 
[email protected]:/# echo $? 
0 
[email protected]:/# ejabberdctl stop 
[email protected]:/# echo $? 
0 
[email protected]:/# ejabberdctl status 
Failed RPC connection to the node [email protected]: nodedown 
[email protected]:/# echo $? 
3 

So sagt uns, dass, wenn Sie eine ejabberd status ausführen und der Daemon nicht ausgeführt wird, erhalten Sie den Exit-Code 3, , wenn es stattdessen ausgeführt wird.

Dort gehen Sie mit Ihrem Bash-Skript:

 
function run() { 
    ejabberdctl start # Repeating just in case... 
    ejabberdctl status &>/dev/null 

    if [ $? -eq 0 ]; then 
    echo "Do some magic here, ejabberd is running..." 
    exit 0 
    fi 

    echo "Ejabberd still down..." 
} 

while true; do run; sleep 1; done 

Und das ist, was Sie im CLI bekommen würde:

 
[email protected]:/# ./check.sh 
Ejabberd still down... 
Do some magic here, ejabberd is running... 
[email protected]:/# ejabberdctl stop 
[email protected]:/# ./check.sh 
Ejabberd still down... 
Ejabberd still down... 
Do some magic here, ejabberd is running... 
Verwandte Themen