2017-01-05 8 views
0

Ich versuche, einen Docker-Container als Dienst auszuführen. Es handelt sich um einen geclusterten Dienst auf mehreren verschiedenen Servern. Es kann einige Sekunden dauern, bis eine Verbindung hergestellt wird. Der Container wird gelegentlich in einer Fehlerschleife stecken bleiben, ohne den Container tatsächlich zu verlassen. Systemd meldet fälschlicherweise den Start als erfolgreich. Ich versuche, den Prozess mit diesen Dingen in meiner Unit-Datei zu überwachen:Überwachen einer Protokolldatei für Systemd Service Start

TimeoutStartSec=60 
Restart=always 
RestartSec=10 
ExecStartPre=-/usr/bin/docker stop %n 
ExecStartPre=-/usr/bin/docker rm %n 
ExecStartPre=/usr/bin/docker pull my_container 
ExecStart=/usr/bin/docker run --name %n my_container 
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | grep -m 1 \"All services up and running.\" ]; do sleep 1; done 

Als ich systemctl start myservice laufen, es dauert einige Sekunden zu starten (scheinbar wegen der docker pull), sondern gibt einen Erfolg relativ schnell.

Allerdings, wenn ich manuell docker logs -f myservice.service ausführen, sehe ich, dass der Dienst nicht protokolliert "Alle Dienste sind betriebsbereit" für ein paar weitere Sekunden.

Ich habe mir https://github.com/ibuildthecloud/systemd-docker angesehen, aber ich bin vorsichtig über ein Repo, das seit über einem Jahr nicht mehr aktualisiert wurde (anscheinend ist Darren mit Rancher beschäftigt).

Also, meine Frage: Warum funktioniert meine ExecStartPost nicht? Gibt es eine bessere Möglichkeit, Container als Service direkt mit Systemd zu starten?

+0

Benötigen Sie wirklich Systemd? Der Docker-Daemon wird Prozesse laufen lassen .... Der "run" -Befehl hat eine Neustart-Richtlinie Option: https://docs.docker.com/engine/reference/run/#/restart-policies---restart –

+0

Ich brauche um mehrere voneinander abhängige Dienste in der Produktion zu betreiben, möchte ich einen sauberen (ish) Weg, um sie zu verwalten. Ich bin mir nicht sicher, wie ich 'docker run' direkt verwenden würde. rc.local? Handbuch? – aayore

+0

Der Docker-Daemon ist selbst ein Prozessmanager. Wenn Sie einen Container mit den Optionen "-d" und "--restart = immer" ausführen, wird er im Hintergrund ausgeführt und bei einem Fehler automatisch neu gestartet. –

Antwort

0

Ich habe herausgefunden, wie man das zur Arbeit bringt, und die Lösung ist ein bisschen wie ein Facepalm. Was ich zu tun versuchte, war in Ordnung, ich brauchte nur den vollständigen Weg, um zu grepen und zu schlafen.

TimeoutStartSec=60 
Restart=always 
RestartSec=10 
ExecStartPre=-/usr/bin/docker stop %n 
ExecStartPre=-/usr/bin/docker rm %n 
ExecStartPre=/usr/bin/docker pull my_container 
ExecStart=/usr/bin/docker run --name %n my_container 
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | /bin/grep -m 1 \"String that indicates my service is up successfully\" ]; do /bin/sleep 1; done 

Ich habe es ein bisschen getestet, und es scheint ziemlich gut zu funktionieren.

Verwandte Themen