Jeg havde et støre problem med docker og hvordan container startes i den rigtige rækkefølge. Hvis du kun bruger docker service til at starte dine container kan du ikke helt styre hvilken container som starter i hvilken rækkefølge.
For at løse dette lavet jeg et systemd script som kalder et bash script som starter container op i den rigtige rækkefølge.
Her er et systemd script som starter efter docker er startet.
$ vi /etc/systemd/my_app.service
[Unit]
Description=Restart docker container in the right way.
After=docker.target
[Service]
Type=oneshot
ExecStart=/data/docker/start_service.sh
ExecStop=/data/docker/stop_service.sh
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
Du kan se det består af 3 dele. En Unit samt Service og en Install del.
Unit bruges her til at beskrive hvad processen gør. Samt sikre den starter op efter at docker service er startet op.
Service beskriver hvilken type det er, her oneshot den simpleste type af service, samt hvilken process som skal startes her start_service.sh
Install beskriver under hvilken target (type) som den skal oprettes under.
For at gøre den nye service aktiv skal vi fortælle systemd vores nye service, dette gøres med kommandoen systemctl som vist.
Du opretter en oneshot-service som enhver anden tjeneste. En brugeroprettet service fil skal ligge i /etc/systemd/system/, mens systemtjenester skal findes i /usr/lib/systemd/system.
Af typer findes der udover oneshot.
simple,forking
exec,dbus,notify,idle
oneshot er også den type som bruges hvis du ikke specificere hvilken type du skal bruge.
Med RemainAfterExit=false, er når processen, der blev startet af ExecStart, afsluttes, kaldes ExecStop (fordi du sagde, at den stopper, når den afsluttes). Hvis du ikke holder en proces kørende i hele tjenestens levetid. Du ville være bedre stillet. På den måde vil systemd betragte tjenesten som aktiv og ikke udføre ExecStop, før du eller noget andet andet fortæller, at den skal stoppe (f.eks. går selve ExecStart-processen ned).
Så brug RemainAfterExit=true ved oneshot
jeg vil ikke komme ind på de andre typer men du skal vide de findes.
For at registere samt enable vores service skriver du.
$ systemctl daemon-reload
$ systemctl enable my_app.service
Disse service kaldes under boot.
Link til jenkins system service