Die Anwendung besteht aus drei Containern:
- MySQL Datenbank Container
- Springboot Backend Container
- Angular Frontend Container
MySQL Datenbank

Hier wird einfach ein „mysqldump“ aus einer existierenden Datenbank nach „docker-entrypoint-initdb.d“ kopiert. Wenn der resultierende Container und damit die Datenbank das allererste Mal hochfährt, werden die Befehle aus dem Dump „data.sql“ ausgeführt (CREATEs, INSERTs etc…)
Passwörter werden von außen zugesteuert (siehe später).
Und natürlich sind die Daten weg, wenn der Container geschlöscht wird. Das gebt besser mit VOLUMES und dem Mount von Daten-Verzeichnissen aus dem Host des Containers.
Springboot Backend

Das bootJAR wurde hier blöderweise vorher gebaut und nicht während der Erzeugung des OCI Images.
Spannend ist aber das „wait-for-it.sh“ Script. Dieses versucht mittels des Linux Befehls Netcat („nc“) eine Verbindung mit dem Socket „database:3306“ herzustellen – in einer Schleife, 15 Mal mit 1 sekündiger Pause. Erst wenn Netcat erfolgreich eine TCP/IP Verbindung zu „database:3306“ aufgebaut hat, wird die Java Anwendung (springboot) gestartet. Kann Netcat nicht erfolgreich verbinden, startet auch Java nicht und der Start des Containers schlägt ebenfalls fehlt (Container ist im Zustand „STOPPED“).
Das Skript „wait-for-it.sh“ stammt aus dem github repository von Giles Hall: https://github.com/vishnubob/wait-for-it
Angular Frontend

Der Source Code muss lokal vorhanden sein, bevor das OCI Image gebaut wird – das kann man besser machen. Z.B. im Dockerfile mittels git pullen und dann bauen – aber je nachdem.
Gut ist, dass in Phase 1 der Source Code kompiliert und anschließend in Phase 2 mittels ngix zur Verfügung gestellt wird.
Die drei Container gemeinsam starten
Und so geht es mit Podman (rootless)