{"id":2685,"date":"2021-01-04T08:00:00","date_gmt":"2021-01-04T07:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=2685"},"modified":"2021-08-01T21:03:04","modified_gmt":"2021-08-01T19:03:04","slug":"kanboard-im-container","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/kanboard-im-container\/","title":{"rendered":"Kanboard im Container&#8230;"},"content":{"rendered":"\n<p>&#8230; aber das sind ja gleich zwei Dinge auf einmal. Richtig. Denn hier versuche ich, etwas n\u00fctzliches (<a href=\"https:\/\/kanboard.org\/\">Kanboard<\/a>) mit der M\u00f6glichkeit, etwas zu lernen (Container), zu kombinieren.<\/p>\n\n\n\n<p>Inspiriert durch <a href=\"https:\/\/www.deimeke.net\/dirk\/blog\/index.php?\/archives\/4049-Applikationen-unter-Linux-am-Beispiel-CentOS.html\">Dirks Artikel<\/a> und einem darauf folgenden, regen E-Mail-Verkehr, widme ich mich mal wieder dem Thema Linux-Container. Zuletzt hatte ich mich ca. 2016\/2017 damit befasst und es mit der Erkenntnis zu den Akten gelegt, dass es noch ein Hype und f\u00fcr den produktiven Einsatz wenig geeignet war. Mittlerweile hat sich die Lage etwas ge\u00e4ndert. Einige Unternehmen haben sich des Themas angenommen und arbeiten daran, Linux-Container <em>Enterprise-Ready<\/em> zu gestalten. So nehme ich wahr, dass in meinem beruflichen Netzwerk seit ca. Anfang 2019 OpenShift-Cluster wie Pilze aus dem Boden schie\u00dfen. Man k\u00f6nnte den Eindruck gewinnen, dass Red Hat diese Subskriptionen wie geschnitten Brot verkauft. Andere Hersteller scheinen den relativ jungen Markt nicht allein den roten H\u00fcten \u00fcberlassen zu wollen. So hat VMware mit vSphere 7 und Tanzu hier ebenfalls eine L\u00f6sung im Portfolio und auch SUSE scheint sich mit dem Kauf von Rancher in diesem Segment st\u00e4rker zu engagieren.<\/p>\n\n\n\n<p>Ich selbst m\u00f6chte mein Wissen rund um dieses Thema auffrischen und habe mir daher folgendes Wochenendprojekt \u00fcberlegt. Um Projekte, Aufgaben oder schlicht den Alltag besser zu organisieren, m\u00f6chte ich zuk\u00fcnftig die Anwendung Kanboard nutzen. Diese Anwendung unterst\u00fctzt die Aufgaben- bzw. Projekt-Organisation nach der <a href=\"https:\/\/de.wikipedia.org\/wiki\/Kanban\">Kanban-Methode<\/a>. Sie macht einen minimalistischen Eindruck, kommt ohne viel Schnick-Schnack daher und scheint daher gut zu mir zu passen. Um gleichzeitig praktische Erfahrungen im Umgang mit Linux-Containern zu sammeln, werde ich Kanboard mit einer Postgresql-Datenbank mit Hilfe von zwei Containern betreiben.<\/p>\n\n\n\n<p>In meinen Augen wird Docker in den n\u00e4chsten Jahren sowohl als Firma wie auch als Werkzeug stetig an Bedeutung verlieren. Daher setze ich bei der Umsetzung meines Wochenend-Projekts auf die Werkzeuge <code>podman<\/code>, <code>skopeo<\/code> und <code>buildah<\/code>.<\/p>\n\n\n\n<p>Ich gehe in diesem Text <strong>nicht<\/strong> auf die Konzepte, die Architektur, sowie die Vor- und Nachteile von Linux-Containern ein. Hierzu wurde in den letzten Jahren bereits genug an anderer Stelle geschrieben. Informationen zu diesen Themen finden sich in der &#8212; im Aufbau befindlichen &#8212; <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/linksammlung\/\" data-type=\"page\" data-id=\"2678\">Linksammlung<\/a> und am <a href=\"#quellen\">Ende dieses Artikels<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"umfeld\">Umfeld<\/h2>\n\n\n\n<p>Als Basis f\u00fcr dieses Projekt dient mir eine virtuelle Maschine in meinem heimischen Labor. Als Betriebssystem nutze ich ein aktuelles RHEL 8 mit der kostenlosen <a href=\"https:\/\/developers.redhat.com\/articles\/faqs-no-cost-red-hat-enterprise-linux\">Developer-Subskription<\/a>. Diese VM dient mir als Host zum Ausf\u00fchren diverser Linux-Container. Um die Container aus dem Netzwerk erreichbar zu machen, installiere ich NGINX aus den Paketquellen von RHEL 8. Dieser k\u00fcmmert sich als <a href=\"https:\/\/de.wikipedia.org\/wiki\/Proxy_(Rechnernetz)#Reverse_Proxy\">Reverse-Proxy<\/a> um die Portweiterleitung zu den Containern. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ziele\">Ziele<\/h2>\n\n\n\n<p>Mit diesem Wochenendprojekt m\u00f6chte ich folgende Ziele erreichen:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Bereitstellung der Anwendung Kanboard mittels Linux-Container<\/li><li>Nutzung von Postgresql mittels Container als Kanboard-Datenbank-Backend<\/li><li>Persistente Speicherung der Kanboard-Inhalte im Dateisystem des Hosts<\/li><li><a href=\"https:\/\/www.my-it-brain.de\/wordpress\/reverse-proxy-fuer-kanboard-im-container\/\" data-type=\"post\" data-id=\"2723\">Erreichbarkeit und Nutzbarkeit von Kanboard \u00fcber den NGINX-Reverse-Proxy<\/a><\/li><li><a href=\"https:\/\/www.my-it-brain.de\/wordpress\/backup-und-restore-im-kanboard-container-land\/\" data-type=\"post\" data-id=\"2705\">Einrichtung Backup und Restore<\/a><\/li><li><a href=\"https:\/\/www.my-it-brain.de\/wordpress\/aktualisierung-eines-kanboard-pods\/\" data-type=\"post\" data-id=\"2812\">Updates<\/a><\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt1\">Schritt 1: rootless-Container-Umgebung einrichten<\/h2>\n\n\n\n<p>W\u00e4hrend Entwickler viel Schwei\u00df und Tr\u00e4nen investiert haben, damit Dienste wie Apache oder NGINX nach ihrem Start die root-Rechte ablegen k\u00f6nnen, liefen die ersten Linux-Container durchg\u00e4ngig mit root-Rechten. Dies ist aus Sicht der IT-Sicherheit nicht w\u00fcnschenswert. Daher ist es in meinen Augen erfreulich, dass es mittlerweile auch ohne root-Rechte geht; <em>Kernel User Namespaces<\/em> sei Dank.<\/p>\n\n\n\n<p>Ich folge der Red Hat Dokumentation (Kapitel 1.4, [<a href=\"#quellen\">1<\/a>]), um den User <em>Alice<\/em> f\u00fcr die Nutzung von rootless-Containern einzurichten.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># echo \"alice:165537:65536\" &gt;&gt; \/etc\/subuid\n&#91;root@podhost-r8-1 ~]# echo \"alice:165537:65536\" &gt;&gt; \/etc\/subgid\n&#91;root@podhost-r8-1 ~]# echo \"user.max_user_namespaces=65636\" &gt; \/etc\/sysctl.d\/userns.conf\n&#91;root@podhost-r8-1 ~]# sysctl -p \/etc\/sysctl.d\/userns.conf\nuser.max_user_namespaces = 65636<\/code><\/pre>\n\n\n\n<p>Anschlie\u00dfend installiere ich wie in Kap. 1.3 [<a href=\"#quellen\">1<\/a>] beschrieben die Container-Tools.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># yum module install -y container-tools<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman --version\npodman version 2.0.5<\/code><\/pre>\n\n\n\n<p>Der Werkzeugkasten ist best\u00fcckt. Weiter zu Schritt 2.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt2\">Schritt 2: Container-Images suchen, inspizieren und herunterladen<\/h2>\n\n\n\n<p>Mit dem Kommando <code>podman<\/code> mache ich mich auf die Suche nach Containern f\u00fcr Kanboard.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman search kanboard\nINDEX       NAME                                            DESCRIPTION                                       STARS   OFFICIAL   AUTOMATED\ndocker.io   docker.io\/kanboard\/kanboard                     Official Docker image for Kanboard                34\ndocker.io   docker.io\/webhippie\/kanboard                    Docker images for Kanboard                        2                  &#91;OK]\ndocker.io   docker.io\/larueli\/kanboard-nonroot              Safe image for Kanboard as Non Root \/ Suitab...   0\ndocker.io   docker.io\/masker\/kanboard                       use alpine linux build kanboard server            0\ndocker.io   docker.io\/xoxys\/kanboard                        Deprecated                                        0\ndocker.io   docker.io\/dotriver\/kanboard                     Kanboard on Alpine Linux + S6 Overlay             0\ndocker.io   docker.io\/thegeeklab\/kanboard                   Custom image for Kanboard Kanban project man...   0\ndocker.io   docker.io\/jonats\/kanboard-pi                    Raspberry Pi image for Kanboard                   0\ndocker.io   docker.io\/bastilian\/kanboard                                                                      0\ndocker.io   docker.io\/oriaks\/kanboard                       Kanboard                                          0                  &#91;OK]\ndocker.io   docker.io\/kanboard\/tests                                                                          0\ndocker.io   docker.io\/blufor\/kanboard                       Kanboard with Postgres, SMTP and GitLab inte...   0                  &#91;OK]\ndocker.io   docker.io\/boomer\/kanboard                       Kanboard is a simple visual task board web a...   0\ndocker.io   docker.io\/joshuacox\/kanboard-redmine            kanboard redmine importer                         0                  &#91;OK]\ndocker.io   docker.io\/janost\/kanboard-unit                  Kanboard + nginx unit, running rootless with...   0\ndocker.io   docker.io\/benoit\/kanboard                                                                         0                  &#91;OK]\ndocker.io   docker.io\/lidstah\/kanboard                      Kanboard armv71 debian (nginx\/php7-fpm) base...   0\ndocker.io   docker.io\/doc75\/kanboard                                                                          0\ndocker.io   docker.io\/witsec\/kanboard                       Kanboard, with the option to filter (hide) s...   0                  &#91;OK]\ndocker.io   docker.io\/ionutalexandru97\/kanboard-openshift   Kanboard ready to be deployed on OpenShift        0\ndocker.io   docker.io\/hihouhou\/kanboard                     simple kanboard                                   0                  &#91;OK]\ndocker.io   docker.io\/alxsdhm\/kanboard                      kanboard image                                    0\ndocker.io   docker.io\/papango\/kanboard                                                                        0\ndocker.io   docker.io\/mrtheduke\/kanboard                    kanboard                                          0\ndocker.io   docker.io\/kvorobyev\/kanboard_app<\/code><\/pre>\n\n\n\n<p>Herzlichen Gl\u00fcckwunsch. Die Trefferliste stellt f\u00fcr mich als SysAdmin einen Alptraum dar. S\u00e4mtliche Treffer stammen vom Docker-Hub, einem riesigen Misthaufen f\u00fcr Software (welcher durchaus ein paar Perlen enthalten kann). Von den 26 Treffern ist keiner als <em>OFFICIAL<\/em> markiert, lediglich die Anzahl <em>STARS<\/em> bietet einen Anhaltspunkt, welcher Container den meisten Zuspruch findet. In einer Produktiv-Umgebung sollte man sich jedoch nicht allein auf diese Sterne verlassen. Ich inspiziere das Container-Image mit den meisten Sternen mit <code>skopeo<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ skopeo inspect docker:\/\/docker.io\/kanboard\/kanboard | less<\/code><\/pre>\n\n\n\n<p>Die vollst\u00e4ndige Ausgabe spare ich hier aus. Sie ist wenig hilfreich. Mit ein wenig Internet-Recherche ([<a href=\"#quellen\">2<\/a>], [<a href=\"#quellen\">3<\/a>] und [<a href=\"#quellen\">4<\/a>]) bin ich hinreichend sicher, das &#8222;offizielle&#8220; Container-Image des Projekts gefunden zu haben.<\/p>\n\n\n\n<p>Als n\u00e4chstes mache ich mich auf die Suche nach Postgresql:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman search postgresql | wc -l\n64<\/code><\/pre>\n\n\n\n<p>Naja, zumindest an Auswahl scheint es auch diesmal nicht zu mangeln. Hier komme ich so jedoch nicht weiter. Also nehme ich einen Webbrowser zur Hand und recherchiere ein geeignetes Container-Image unter der URL: <a href=\"https:\/\/catalog.redhat.com\/software\/containers\/explore\">https:\/\/catalog.redhat.com\/software\/containers\/explore<\/a><\/p>\n\n\n\n<p>Da ich Red Hat bereits zutraue, eine stabile und hinreichend sichere Enterprise Linux Distribution zu bauen, traue ich ihnen auch zu, ordentliche Container-Images f\u00fcr Postgresql zu bauen. Daher fasse ich folgende drei Kandidaten ins Auge:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><a href=\"https:\/\/catalog.redhat.com\/software\/containers\/rhel8\/postgresql-96\/5ba0ad1f5a134643ef2eeb9d\">rhel8\/postgresql-96<\/a><\/li><li><a href=\"https:\/\/catalog.redhat.com\/software\/containers\/rhel8\/postgresql-10\/5ba0ae0ddd19c70b45cbf4cd\">rhel8\/postgresql-10<\/a><\/li><li><a href=\"https:\/\/catalog.redhat.com\/software\/containers\/rhel8\/postgresql-12\/5db133bd5a13461646df330b\">rhel8\/postgresql-12<\/a><\/li><\/ol>\n\n\n\n<p>Zu diesem Zeitpunkt (2020-12-27) fehlt Nr. 3 eine ordentliche Beschreibung. Daf\u00fcr kommt dieses Image mit 6 offenen Sicherheitsl\u00fccken daher. Nr. 2 besitzt nur 3 Schwachstellen und eine deutliche bessere Dokumentation zu dessen Verwendung. Und Nr. 1 ist zwar das \u00c4lteste, jedoch auch das mit einer guten Dokumentation und ohne Schwachstellen.<\/p>\n\n\n\n<p>Kanboard erfordert Postgresql &gt;= 9.4. Damit ist Nummer 1 mein Gewinner. Mit den beiden folgenden Kommandos hole ich mir die Kanboard- und Postgresql-Container-Images auf meinen Host.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman pull docker.io\/kanboard\/kanboard\nTrying to pull docker.io\/kanboard\/kanboard...\nGetting image source signatures\nCopying blob df20fa9351a1 done  \nCopying blob 3108c8300796 done  \nCopying blob b190b4dd9bb5 done  \nCopying blob bb1f52abd628 done  \nCopying blob e37ffd2cbe7b done  \nCopying config c355188e0c done  \nWriting manifest to image destination\nStoring signatures\nc355188e0c187bc891826d282cc850cbe0907ccd7df28d4487d024d831c4f9af\n\n$ podman login --username=Joerg-Dev registry.redhat.io\nPassword: \nLogin Succeeded!\n$ podman pull registry.redhat.io\/rhel8\/postgresql-96\nTrying to pull registry.redhat.io\/rhel8\/postgresql-96...\nGetting image source signatures\nCopying blob cca21acb641a done  \nCopying blob 620696f92fec done  \nCopying blob fca753c96be9 done  \nCopying blob d9e72d058dc5 done  \nCopying config f7266b012d done  \nWriting manifest to image destination\nStoring signatures\nf7266b012db03478b858eba6af4264829b99ce9ac67d6bc8a7c273b5fc5c8e9a<\/code><\/pre>\n\n\n\n<p>Damit ist dieser Schritt abgeschlossen. In Schritt drei erstelle ich sogenannte <em>Volumes<\/em>, um Daten au\u00dferhalb der Container persistent im Dateisystem des Hosts speichern zu k\u00f6nnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt3\">Schritt 3: Persistenten Speicher f\u00fcr Container erzeugen<\/h2>\n\n\n\n<p>Nach dem Container-Mantra haben diese zustandslos zu sein. Dies bedeutet, dass in ihnen gespeicherte Daten verloren gehen, wenn der Container entfernt wird. Nun hat es die Elektronische Datenverarbeitung (EDV) so an sich, dass das Ergebnis der Verarbeitung h\u00e4ufig persistent zu speichern ist. Dies kann im Container-Universum mit sogenannten <em>Volumes<\/em> erledigt werden. Hierbei wird ein Verzeichnis vom Host in den Container eingeh\u00e4ngt.<\/p>\n\n\n\n<p>F\u00fcr mein Projekt erstelle ich nach Kapitel 3.4 [<a href=\"#quellen\">1<\/a>] folgende Volumes:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>kanboard_data<\/li><li>kanboard_plugins<\/li><li>kanboard_ssl<\/li><li>pgsql_db<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman volume create VOLUMENAME<\/code><\/pre>\n\n\n\n<p><s>Um im Folgenden etwas leichter mit diesen Volumes arbeiten zu k\u00f6nnen, speichere ich den Einh\u00e4ngepfad in Variablen \u00e0 la:<\/s><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><s>$ mntPoint=$(podman volume inspect VOLUMENAME --format {{.Mountpoint}})<\/s><\/code><\/pre>\n\n\n\n<p>Die obige Streichung erfolgte, da dieser Schritt nicht notwendig ist und im weiteren Artikel nicht mit entsprechenden Variablen gearbeitet wird.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt4\">Schritt 4: Kanboard konfigurieren<\/h2>\n\n\n\n<p>Um eine angepasste, persistente config.php-Datei f\u00fcr den Kanboard-Container zu schreiben, ist etwas Vorarbeit notwendig. Der Kanboard-Container wird gestartet und das Volume &#8222;kanboard_data&#8220; wird dabei in den Pfad \/var\/www\/app\/data gemountet. Anschlie\u00dfend starte ich eine Shell im Container und kopiere die Datei <code>\/var\/www\/app\/config.default.php<\/code> nach <code>\/var\/www\/app\/data\/config.php<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman run -d --name kanboard -v kanboard_data:\/var\/www\/app\/data:Z  kanboard\/kanboard\n93e6d7e3847fb94639b8fce89ddb93a3879a80522f95ed13dff91f6558594ac6\n$ podman ps\nCONTAINER ID  IMAGE                               COMMAND  CREATED        STATUS            PORTS   NAMES\n93e6d7e3847f  docker.io\/kanboard\/kanboard:latest           5 seconds ago  Up 5 seconds ago          kanboard\n$ podman exec -it 93e6d7e3847f \/bin\/bash\nbash-5.0# cp \/var\/www\/app\/config.default.php \/var\/www\/app\/data\/config.php\nbash-5.0# exit\nexit\n$ podman stop 93e6d7e3847f &amp;&amp; podman rm 93e6d7e3847f\n$ vi $kanboard_data\/config.php<\/code><\/pre>\n\n\n\n<p>Um Postgresql als Datenbank-Backend zu nutzen, werden folgende Werte in der <code>config.php<\/code> gesetzt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Run automatically database migrations\n\/\/ If set to false, you will have to run manually the SQL migrations from the CLI during the next Kanboard upgrade\n\/\/ Do not run the migrations from multiple processes at the same time (example: web page + background worker)\ndefine('DB_RUN_MIGRATIONS', true);\n\n\/\/ Database driver: sqlite, mysql or postgres (sqlite by default)\ndefine('DB_DRIVER', 'postgres');\n\n\/\/ Mysql\/Postgres username\ndefine('DB_USERNAME', 'root');\n\n\/\/ Mysql\/Postgres password\ndefine('DB_PASSWORD', 'SuperSicheresPasswort');\n\n\/\/ Mysql\/Postgres hostname\ndefine('DB_HOSTNAME', 'localhost');\n\n\/\/ Mysql\/Postgres database name\ndefine('DB_NAME', 'kanboard');\n\n\/\/ Mysql\/Postgres custom port (null = default port)\ndefine('DB_PORT', null);<\/code><\/pre>\n\n\n\n<p>Normalerweise w\u00fcrde man eine Anwendung niemals mit dem Datenbank-Root-User auf eine Datenbank zugreifen lassen. In dieser Umgebung ist es hingegen verschmerzbar, da nur die Daten des Kanboards in diesem Postgresql-Container gespeichert werden. Im Falle einer Kompromittierung verliere ich nur die zur Anwendung geh\u00f6rende Datenbank.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt5\">Schritt 5: Pod erstellen und Container hinzuf\u00fcgen<\/h2>\n\n\n\n<p>Mit diesem Schritt habe ich etwas M\u00fche. Zuerst wollte ich einen Pod erstellen, den Kanboard- und Postgresql-Container zu diesem hinzuf\u00fcgen, um sie stets gemeinsam starten und stoppen zu k\u00f6nnen. Dies ist laut [<a href=\"#quellen\">1<\/a>] und [<a href=\"#quellen\">7<\/a>] der einfachste Weg. Allerdings habe ich dann in [<a href=\"#quellen\">5<\/a>] und [<a href=\"#quellen\">7<\/a>] gelesen, dass sich die Container eines Pods dessen IP, MAC und Port-Bindings teilen. <s>Dies bedeutet, dass Portfreigaben f\u00fcr Kanboard (80 und 443 TCP) auch f\u00fcr den Postgresql-Container g\u00fcltig sind. Dies m\u00f6chte ich eigentlich nicht. Doch ist mir bisher nichts besseres eingefallen.<\/s> Falls ihr Anregungen oder konkrete Beschreibungen habt, wie ich dies besser umsetzen kann, immer her damit.<\/p>\n\n\n\n<p>Frickelpit hat mich in seinem Kommentar darauf hingewiesen, dass man den Zugriff auf den Port des Pods noch weiter beschr\u00e4nken kann, indem man diesen an 127.0.0.1 bindet. Ich habe unten stehenden Code-Block entsprechend aktualisiert.<\/p>\n\n\n\n<p>Ich erstelle nun gem\u00e4\u00df [<a href=\"#quellen\">7<\/a>] einen neuen Pod, welcher den Kanboard-Container beinhaltet und f\u00fcr diesen Port-Bindings besitzt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman run -d --pod new:kanboardpod --name kanboard -p 127.0.0.1:8080:80 -v kanboard_data:\/var\/www\/app\/data:Z -v kanboard_plugins:\/var\/www\/app\/plugins:Z kanboard\/kanboard\ne62c7fa2ecf771f4085e788e9f0f7d24b7f87d487e9951a403847d8a7a2a6471\n\n$ podman pod ps\nPOD ID        NAME         STATUS   CREATED        # OF CONTAINERS  INFRA ID\nd7afa6821382  kanboardpod  Running  8 seconds ago  2                6b065fe7ecc7\n\n$ podman ps\nCONTAINER ID  IMAGE                               COMMAND  CREATED         STATUS             PORTS                 NAMES\n6b065fe7ecc7  k8s.gcr.io\/pause:3.2                         10 seconds ago  Up 10 seconds ago  0.0.0.0:8080-&gt;80\/tcp  d7afa6821382-infra\ne62c7fa2ecf7  docker.io\/kanboard\/kanboard:latest           10 seconds ago  Up 10 seconds ago  0.0.0.0:8080-&gt;80\/tcp  kanboard<\/code><\/pre>\n\n\n\n<p>Im zweiten Schritt f\u00fcge ich den Postgresql-Container hinzu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman run -d --pod kanboardpod --name pgsql_db -e POSTGRESQL_USER=root -e POSTGRESQL_PASSWORD=SuperGeheimesPasswort -e POSTGRESQL_DATABASE=kanboard -v pgsql_data:\/var\/lib\/pgsql\/data:Z rhel8\/postgresql-96\nc242a4b9b57d53a822585c9eb83d081d5abbd40cb2b5952aee4457fee041e128\n\n$ podman ps\nCONTAINER ID  IMAGE                                          COMMAND         CREATED        STATUS            PORTS                 NAMES\n6b065fe7ecc7  k8s.gcr.io\/pause:3.2                                           2 minutes ago  Up 2 minutes ago  0.0.0.0:8080-&gt;80\/tcp  d7afa6821382-infra\nc242a4b9b57d  registry.redhat.io\/rhel8\/postgresql-96:latest  run-postgresql  3 seconds ago  Up 3 seconds ago  0.0.0.0:8080-&gt;80\/tcp  pgsql_db\ne62c7fa2ecf7  docker.io\/kanboard\/kanboard:latest                             2 minutes ago  Up 2 minutes ago  0.0.0.0:8080-&gt;80\/tcp  kanboard<\/code><\/pre>\n\n\n\n<p>Nun l\u00e4uft ein Pod mit drei Containern (Infra-, Kanboard- und Postgresql-Container). Rufe ich <code>http:\/\/IP-DES-HOSTS:8080<\/code> in einem Webbrowser auf, begr\u00fc\u00dft mich bereits die Kanboard-Anmeldemaske (Bild 1).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"365\" height=\"338\" src=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2020\/12\/kanboard-anmeldemaske.png\" alt=\"\" class=\"wp-image-2697\" srcset=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2020\/12\/kanboard-anmeldemaske.png 365w, https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2020\/12\/kanboard-anmeldemaske-300x278.png 300w\" sizes=\"auto, (max-width: 365px) 100vw, 365px\" \/><figcaption>Bild 1: Kanboard-Anmeldemaske<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schritt6\">Schritt 6: Nacharbeiten<\/h2>\n\n\n\n<p>Zwar konnte ich mich bereits an der Kanboard-Anwendung anmelden, neue Nutzer erstellen und Profileinstellungen verwalten, doch beim Dateiupload klemmte es noch. Hier musste ich in der <code>config.php<\/code>-Datei des Kanboard-Containers den folgenen Standardwert, wie im Codeblock gezeigt, angepassen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Folder for uploaded files (must be writeable by the web server user)\n\/\/ Folgende Zeilen wurden auskommentiert\n\/\/ define('FILES_DIR', DATA_DIR.DIRECTORY_SEPARATOR.'files');\n\n\/\/ Folgender Eintrag wurde hinzugefuegt\ndefine('FILES_DIR', 'data\/files');<\/code><\/pre>\n\n\n\n<p>Abschlie\u00dfend habe ich den Kanboard-Container mittels <code>podman restart kanboard<\/code> neugestartet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zwischenfazit\">Fazit<\/h2>\n\n\n\n<p>Bei der Internet-Recherche nach guter Dokumentation und der Arbeit mit einigen Container-Registries erinnere ich mich an ein Zitat:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Das Internet ist ein gro\u00dfer Misthaufen, in dem man allerdings auch kleine Sch\u00e4tze und Perlen finden kann.<\/p><cite>Joseph Weizenbaum, <em>Vortrag in Hamburg am 2. Mai 2001, <a href=\"http:\/\/www.heise.de\/newsticker\/meldung\/17502\">heise.de<\/a><\/em><\/cite><\/blockquote>\n\n\n\n<p>Bisher wurden die Ziele 1-3 erreicht. Die dabei verwendeten Befehlszeilen besitzen eine beachtliche L\u00e4nge. Hier bietet es sich an, die Befehle in kurze Shell-Wrapper zu verpacken.<\/p>\n\n\n\n<p>Die Ziele 4 und 5 werde ich in einem Folgeartikel, an einem anderen Wochenende, in Angriff nehmen. Und auch der Frage, wie man diesen Verhau am besten aktualisiert und Updates implementiert, werde ich noch nachgehen.<\/p>\n\n\n\n<p>Ihr habt bis hierhin durchgehalten? Dann danke ich euch f\u00fcr euer Interesse. Was haltet ihr von diesem Wochend-Projekt? Wieviel Sinn bzw. Unsinn steckt darin? Bitte lasst es mich in den Kommentaren oder auch gern per E-Mail wissen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"quellen\">Quellen und weiterf\u00fchrende Links<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li><a href=\"https:\/\/access.redhat.com\/documentation\/en-us\/red_hat_enterprise_linux\/8\/html\/building_running_and_managing_containers\/index\">Building, running, and managing Linux containers on Red\u00a0Hat Enterprise\u00a0Linux\u00a08<\/a><\/li><li><a href=\"https:\/\/kanboard.org\/\">Kanban Project Management Software &#8212; Kanboard<\/a><\/li><li><a href=\"https:\/\/docs.kanboard.org\/en\/latest\/admin_guide\/docker.html\">Running Kanboard with Docker<\/a><\/li><li><a href=\"https:\/\/github.com\/kanboard\/kanboard\/releases\">Kaboard Releases<\/a><\/li><li><a href=\"https:\/\/podman.io\/getting-started\/network\">https:\/\/podman.io\/getting-started\/network<\/a><\/li><li><a href=\"https:\/\/developers.redhat.com\/blog\/2019\/01\/15\/podman-managing-containers-pods\/\">Podman: Managing pods and containers in a local container runtime<\/a>; <a href=\"https:\/\/developers.redhat.com\/blog\/author\/bbaude\/\">Brent Baude<\/a>; January 15, 2019<\/li><\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; aber das sind ja gleich zwei Dinge auf einmal. Richtig. Denn hier versuche ich, etwas n\u00fctzliches (Kanboard) mit der M\u00f6glichkeit, etwas zu lernen (Container), zu kombinieren. Inspiriert durch Dirks Artikel und einem darauf folgenden, regen E-Mail-Verkehr, widme ich mich mal wieder dem Thema Linux-Container. Zuletzt hatte ich mich ca. 2016\/2017 damit befasst und es<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/kanboard-im-container\/\">[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":[517,430,305,607,606,608],"class_list":["post-2685","post","type-post","status-publish","format-standard","hentry","category-wochenend-projekte","tag-container","tag-osbn","tag-planet","tag-pod","tag-podman","tag-skopeo"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2685","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=2685"}],"version-history":[{"count":19,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2685\/revisions"}],"predecessor-version":[{"id":2898,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2685\/revisions\/2898"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=2685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=2685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=2685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}