iDempiere im Podman Container #
Da ich seit einiger Zeit mit Podman experimentiere und auch viel mit iDempiere arbeite, habe ich mir überlegt, das mal zu kombinieren und zu sehen, wie kompliziert es ist, iDempiere in einem von Podman verwalteten Container zu starten. Dabei versuche ich, nachvollziehbar zu gestalten, welche Gedanken ich mir dabei gemacht habe und was ich gelernt habe.
Als Grundlage nehme ich das vorhandene Docker-Image unter https://hub.docker.com/r/idempiereofficial/idempiere. Dessen Quellcode hat auch ein Github-Repository, wenn man sich das dockerfile anschauen möchte, das das Container-Image definiert und erzeugt.
PostgreSQL starten #
Da Podman zwar fast genauso funktioniert wie Docker, aber eben nicht genau, habe ich mir die dort dokumentierten Befehle genau angeschaut. Im dort angegebenen Beispiel wird ein Postgres-Server und ein iDempiere-Server jeweils in einem eigenen Container gestartet. Der erste Schritt ist also jetzt, einen Postgres-Server zu starten. Das mache ich mit folgendem Befehl:
podman run -d --name postgres -p 15432:5432 -e POSTGRES_PASSWORD=postgresPW \ -v /home/tbayen/idempiere/pgdata/:/var/lib/postgresql/data \ docker.io/postgres:13
Ich wollte hier den Port des Datenbank-Servers auf den Host-Port 15432 umleiten, da auf meinem Testrechner noch ein lokaler Postgres-Server lief, mit dem es sonst eine Kollision hätte geben können. Allerdings funktionierte das auf Grund eines Bugs im docker-entrypoint.sh nicht.
In einer perfekten iDempiere-Lösung wäre außerdem zu überlegen, wie man das Networking zwischen den beiden Servern am besten aufbaut. Hier würde sich ein Podman Container Pod anbieten oder eine andere Art von Networking, falls man komplexere Anforderungen hat, z.B. die Server z.B. auf unterschiedliche Hardware verteilen möchte, die Datenbank replizieren will oder zur Lastverteilung mehrere parallele iDempiere-Server haben möchte. Aber dazu vielleicht später mehr... (Interessant dazu vielleicht https://www.redhat.com/sysadmin/container-networking-podman)
Das Postgres-Passwort "postgres" (und auch mein obiges), das in der Anleitung des Images angegeben ist, ist sicherlich nicht so sehr einfallsreich, das sollte man ändern.
Die Zeile mit dem -v dienst dazu, ein Datenverzeichnis anzugeben, in das die eigentliche Datenbank gespeichert wird. Ohne diese Zeile befindet sich diese innerhalb des Containers. Was man lieber hat bzgl. Backups etc, muss man selber wissen. Für mich war ausschlaggebend, das das innere des Containers beim kompletten Neustart desselben natürlich auch immer wieder leer ist, was beim Testen und Neuinstallieren extrem lästig ist.
Der originale Docker-Befehl von der Seite des iDempiere-Images gab als Image-Namen "postgres:13" an, was einerseits das Image bezeichnet und andererseits ein Tag, das hier die Versionsnummer des Servers angibt. Das Image wird dann ggf. automatisch aus einem sogenannten Repository geladen. Als Repository ist bei Docker docker.io fest voreingestellt. Das ist bei Podman unter Debian nicht so. Entweder trägt man dieses in registries.conf manuell ein oder man gibt das Repository bei der Benennung des Images mit an, wie ich das hier oben tue.
Übrigens kann man bei diesem Image "postgres" den sonst vor einem "/" anzugebenden Namen desjenigen, der es hochgeladen hat, zur Identifizierung weglassen, weil es ein sogenanntes "official Image" ist, also bei docker.io einen besonderen Status hat. Das macht für eine Software wie Postgres ja wahrscheinlich auch Sinn und erleichtert die Orientierung.
Testen kann ich das jetzt mit
psql -p 5432 -h localhost postgres postgres
Anleitungen zu diversen anderen Konfigurationen des Postgres-Servers finden sich natürlich in der Beschreibung zum Postgres Image
iDempiere starten #
Bis jetzt habe ich nur etwas gemacht, was bereits tausendmal erprobt und getestet ist. Jetzt geht es an das eigentlich spannende: Das iDempiere-Image starten. Das mache ich mit folgendem Befehl:
podman run -d --name idempiere -p 8443:8443 \
-e DB_HOST=192.168.1.147 -e DB_PORT=5432 \ -e DB_NAME=idempiere -e DB_USER=adempiere -e DB_PASS=adempierePW \ -e DB_ADMIN_PASS=postgresPW \ -v /home/tbayen/Projekte/container-idempiere/log/:/opt/idempiere/log/ \ docker.io/idempiereofficial/idempiere:10
So, wie ich das Netzwerk jetzt eingerichtet habe, kann man den PostgreSQL-Server auf dem Hostrechner unter dem Port 5432 erreichen. (Der Host-Rechner ist aus einem Container augenscheinlich unter der localhost-Adresse zu erreichen. Es gibt dort also kein Container-lokales localhost.) Den Namen der Datenbank kann man frei wählen. Als Benutzer wird eigentlich immer adempiere benutzt. (Ich würde das jetzt nicht ändern, obwohl ich auch nicht genau weiss, ob das verboten wäre.)
Ich empfehle auch, wie in obigem Befehl das Verzeichnis der Logdateien zu mappen, so das man da vom Host aus reinschauen kann.
Zum Image-Namen gilt das oben bereits gesagte: docker.io könnte man auch in der registry.conf angeben, geht aber auch so.
Debugging #
Bei Startproblemen habe ich eine Weile gebraucht, um zu merken, das man ein Log des Startvorgangs (also insbesondere des docker-entrypoint.sh Skripts) mit
podman logs idempiere
bekommen kann (oder, indem man die -d Option weglässt). Dort bin ich dann z.B. hinter anfängliche Probleme beim Zugriff auf die Datenbank gekommen. Außerdem hilfreich waren noch die podman-Befehle ps und top sowie natürlich exec. Mehr dazu findet ihr in den manpages von podman.
Einloggen #
Nun kann man mit dem Browser unter https://localhost:8443/webui/ auf iDempiere zugreifen. Ab hier gehts weiter wie sonst auch. Viel Spaß!
weitere Schritte #
- Hier ist beschrieben, wie man ein systemd-Startskript erzeugen kann, so das die Container automatisch hochfahren.
- Das Networking sollte in einem produktiven System auf jeden Fall besser durchdacht werden, damit kein Zugriff von außerhalb möglich ist.
- Die Installation eines eigenen SSL-Zertifikates sollte auch beschrieben werden.