{"id":2735,"date":"2021-02-22T08:00:00","date_gmt":"2021-02-22T07:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=2735"},"modified":"2021-02-14T13:23:40","modified_gmt":"2021-02-14T12:23:40","slug":"podman-kann-auch-systemd-service-units-generieren","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/podman-kann-auch-systemd-service-units-generieren\/","title":{"rendered":"Podman kann auch Systemd-Service-Units generieren"},"content":{"rendered":"\n<p>Mit &#8222;<a href=\"https:\/\/www.my-it-brain.de\/wordpress\/kanboard-im-container\/\" data-type=\"post\" data-id=\"2685\">Kanboard im Container&#8230;<\/a>&#8220; hat mein Ausflug ins Containerland begonnen. Mittlerweile l\u00e4uft mein Pod bereits eine Weile und ich nutze die Anwendung regelm\u00e4\u00dfig. Jedoch musste ich nach jedem Neustart des Hosts den Pod <em>kanboardpod<\/em> manuell starten. Ich hatte mir daher vorgenommen, hierf\u00fcr eine Systemd-Service-Unit zu erstellen, welche diesen Task automatisiert. Doch habe ich mit Freude festgestellt, dass podman-generate-systemd(1) mir diese Arbeit abnehmen kann.<\/p>\n\n\n\n<p>Also starte ich einen ersten Versuch und erzeuge entsprechende Service-Unit-Dateien in meinem HOME-Verzeichnis. Die Option &#8222;<code>--name<\/code>&#8220; sorgt daf\u00fcr, dass in den Service-Unit-Dateien die Namen des Pods bzw. der Container verwendet werden, anstatt der UUIDs. Die Option &#8222;<code>--file<\/code>s&#8220; sorgt daf\u00fcr, dass die Ausgabe in Dateien und nicht auf die Standard-Ausgabe geschrieben wird.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman generate systemd --name --files kanboardpod\n\/home\/alice\/pod-kanboardpod.service\n\/home\/alice\/container-kanboard.service\n\/home\/alice\/container-pgsql_db.service\n\n$ cat pod-kanboardpod.service\n# pod-kanboardpod.service\n# autogenerated by Podman 2.0.5\n# Mon Jan 25 13:19:51 CET 2021\n\n&#91;Unit]\nDescription=Podman pod-kanboardpod.service\nDocumentation=man:podman-generate-systemd(1)\nWants=network.target\nAfter=network-online.target\nRequires=container-kanboard.service container-pgsql_db.service\nBefore=container-kanboard.service container-pgsql_db.service\n\n&#91;Service]\nEnvironment=PODMAN_SYSTEMD_UNIT=%n\nRestart=on-failure\nExecStart=\/usr\/bin\/podman start 62cdd29105a4-infra\nExecStop=\/usr\/bin\/podman stop -t 10 62cdd29105a4-infra\nExecStopPost=\/usr\/bin\/podman stop -t 10 62cdd29105a4-infra\nPIDFile=\/run\/user\/1000\/containers\/overlay-containers\/b3c9bd9754cdc999108d0f4aad7d808c007cc34eee34faefd41ee39c3e1ca18b\/userdata\/conmon.pid       \nKillMode=none\nType=forking\n\n&#91;Install]\nWantedBy=multi-user.target default.target\n\n$ cat container-kanboard.service \n# container-kanboard.service\n# autogenerated by Podman 2.0.5\n# Mon Jan 25 13:19:51 CET 2021\n\n&#91;Unit]\nDescription=Podman container-kanboard.service\nDocumentation=man:podman-generate-systemd(1)\nWants=network.target\nAfter=network-online.target\nBindsTo=pod-kanboardpod.service\nAfter=pod-kanboardpod.service\n\n&#91;Service]\nEnvironment=PODMAN_SYSTEMD_UNIT=%n\nRestart=on-failure\nExecStart=\/usr\/bin\/podman start kanboard\nExecStop=\/usr\/bin\/podman stop -t 10 kanboard\nExecStopPost=\/usr\/bin\/podman stop -t 10 kanboard\nPIDFile=\/run\/user\/1000\/containers\/overlay-containers\/99d386a42b186efb3347d909cea265b990469dc33e1889a3006425a71956699b\/userdata\/conmon.pid\nKillMode=none\nType=forking\n\n&#91;Install]\nWantedBy=multi-user.target default.target\n\n$ cat container-pgsql_db.service \n# container-pgsql_db.service\n# autogenerated by Podman 2.0.5\n# Mon Jan 25 13:19:51 CET 2021\n\n&#91;Unit]\nDescription=Podman container-pgsql_db.service\nDocumentation=man:podman-generate-systemd(1)\nWants=network.target\nAfter=network-online.target\nBindsTo=pod-kanboardpod.service\nAfter=pod-kanboardpod.service\n\n&#91;Service]\nEnvironment=PODMAN_SYSTEMD_UNIT=%n\nRestart=on-failure\nExecStart=\/usr\/bin\/podman start pgsql_db\nExecStop=\/usr\/bin\/podman stop -t 10 pgsql_db\nExecStopPost=\/usr\/bin\/podman stop -t 10 pgsql_db\nPIDFile=\/run\/user\/1000\/containers\/overlay-containers\/fe757283f0662220fee23a563053ea7f30dbdf6d9fbb492c010a01dd7598fc9b\/userdata\/conmon.pid\nKillMode=none\nType=forking\n\n&#91;Install]\nWantedBy=multi-user.target default.target<\/code><\/pre>\n\n\n\n<p>Um die generierten Service-Units zu installieren und zuk\u00fcnftig als derjenige User auszuf\u00fchren, welcher den Pod und die Container erzeugt hat, verschiebe ich sie in das zu erstellende Verzeichnis <em>~\/.config\/systemd\/user<\/em>. Anschlie\u00dfend werden die neuen Units in die Systemd-Konfiguration eingelesen und aktiviert.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ mkdir -p .config\/systemd\/user\n$ mv *.service .config\/systemd\/user\/\n$ systemctl --user enable pod-kanboardpod.service\n$ podman pod stop kanboardpod\n$ systemctl --user start pod-kanboardpod.service<\/code><\/pre>\n\n\n\n<p>Nachdem ich die Service-Units an die richtige Stelle verschoben und aktiviert hatte, habe ich meine laufende Pod-Instanz gestoppt und \u00fcber die entsprechende Service-Unit gestartet.<\/p>\n\n\n\n<p>Ich w\u00e4hnte mich nun bereits am Ziel. Doch nach einem Neustart des Hosts war die Anwendung wieder nicht verf\u00fcgbar. Die Service-Unit war nicht gestartet worden. Podman kann hier nichts daf\u00fcr, denn es ist <code>systemd<\/code>, welcher daf\u00fcr sorgt, dass im User-Kontext laufende Services beendet werden, wenn sich der entsprechende User ausloggt und diese erst startet, wenn der User sich einloggt.<\/p>\n\n\n\n<p>Valentin Rothberg von Red Hat gab mir den entscheidenden Tipp, um dieses Problem zu l\u00f6sen. Die L\u00f6sung versteckt sich in der Manpage zu podman-generate-systemd(1):<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>The systemd user instance is killed after the last session for the user is closed. The systemd user instance can be kept running ever after the user logs out by enabling lingering using<br><br> $ loginctl enable-linger &lt;username&gt;<\/p><cite>Manual page podman-generate-systemd(1)<\/cite><\/blockquote>\n\n\n\n<p>@Valentin: Thanks a lot, that solved my issue!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Ich bin ehrlich gesagt hoch erfreut, dass die Entwickler hier eine M\u00f6glichkeit vorgesehen haben, um aus bestehenden Pods bzw. Container-Instanzen Systemd-Service-Units generieren zu k\u00f6nnen. Dies erm\u00f6glicht es, Container-Instanzen und Pods mit den gewohnten Werkzeugen zu starten, zu stoppen und deren Status zu kontrollieren.<\/p>\n\n\n\n<p>So besteht die M\u00f6glichkeit, die <em>rootless<\/em>-Podman-Container auch als unprivilegierte Dienste laufen zu lassen. Das gef\u00e4llt mir.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit &#8222;Kanboard im Container&#8230;&#8220; hat mein Ausflug ins Containerland begonnen. Mittlerweile l\u00e4uft mein Pod bereits eine Weile und ich nutze die Anwendung regelm\u00e4\u00dfig. Jedoch musste ich nach jedem Neustart des Hosts den Pod kanboardpod manuell starten. Ich hatte mir daher vorgenommen, hierf\u00fcr eine Systemd-Service-Unit zu erstellen, welche diesen Task automatisiert. Doch habe ich mit Freude<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/podman-kann-auch-systemd-service-units-generieren\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[57],"tags":[430,305,606,615,593],"class_list":["post-2735","post","type-post","status-publish","format-standard","hentry","category-wochenend-projekte","tag-osbn","tag-planet","tag-podman","tag-podman-generate-systemd","tag-systemd-service"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2735","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=2735"}],"version-history":[{"count":5,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2735\/revisions"}],"predecessor-version":[{"id":2767,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2735\/revisions\/2767"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=2735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=2735"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=2735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}