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?
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 –
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
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. –