Tomcat 9 mit Manager Gui in Docker Image starten

Eigentlich wollte ich nur schnell eine Spring Boot Applikation als WAR File mit Tomcat in einem Docker Container deployen. Ich dachte, das sollte schnell gehen. Doch dann merkte ich, dass die Manager Gui fehlte. Es folgte eine längere Suche. Und auch in etlichen Stack Overflow Diskussionen hat niemand die folgende Lösung dokumentiert.

tl;dr / für Eilige: Ich habe die Lösung in einem Github Repository hinterlegt. Dort kann entweder alles nachprogrammiert werden oder einfach das Repo geklont werden.

Worum geht es?

In Docker Files aktuellen Tomcat Versionen größer als 8 fehlt die Manager Gui. Möchte ich den Manager betreiben, ist dazu etwas an Aufwand notwendig.

Die aktuellen Docker Images von Apache Tomcat befinden sich auf Docker Hub Die Dokumentation dort ist allerdings äußerst spärlich. Als Beispiel bekomme ich einen einfachen Befehlt docker run -it --rm -p 8888:8080 tomcat:9.0 . Damit lässt sich das Image starten, aber ohne Manager Gui. Tomcat zeigt eine 404 Seite an.

Für die Manager Gui benötigt man einen Tomcat User. Wie diese angelegt werden, wird relativ langwierig in den Tomcat Docs beschrieben.

Wie bekomme ich den User in den Docker Container? Und was muss in dem File überhaupt stehen?

Dazu kann ich mich im Container einloggen. Im File $CATALINA_BASE/conf/tomcat-users.xml sind keine User angelegt. Diese müssen nachgetragen werden und anschließend tomcat neu gestartet. Dies geht nicht über den einfachen Docker Command, da nach einem Neustart des Containers alle geänderten Daten weg sind. Also muss ein Volume her. Kurzer Hinweis an der Stelle, dass lokale Volume Pfads für Docker CLI immer absolut sein müssen.

mkdir config
ABS_PATH=pwd

Anschließend kann ich aus dem laufenden Container Daten auf meine lokale Festplatte kopieren:

docker cp tomkat:/usr/local/tomcat/conf/tomcat-users.xml $ABS_PATH/config/tomcat-users.xml

Das File muss angepasst werden und sieht in Tomcat 9 etwa so aus wie in Github hinterlegt.

Jetzt sollten die neuen User im Container sein. Ich kann mich mit
docker exec -it tomkat bash
einloggen und mit cat conf/tomcat-users.xml nachsehen.

Nur sehe ich immer noch eine 404 Seite, wenn ich http://localhost:8888/manager aufrufe.

An der Stelle suchte ich längere Zeit bis ich micht in dem Container genauer umsah. Des Rätsels Lösung: das webapps Directory ist leer. Es gibt dort keine Manager Gui Applikation und daher sehe ich im Browser auch nichts. Eigentlich macht das auch Sinn für das Dockerfile. Ich möchte in Liveumgebungen den Manager vermutlich nicht haben. Und auch die Beispielapplikationen nicht jedes Mal löschen.

Für den aktuellen Fall ist das aber schlecht – wir möchten den Manager haben. Zum Glück ist dieser im Container zu finden und zwar im Verzeichnis webapps.dist, welches künftig webapps sein soll. Das geht wieder nicht innerhalb des Containers, da nach jedem Neustart die Änderungen weg sind. Also kopieren wir die Dateien lokal herunter.

docker cp tomkat:/usr/local/tomcat/webapps.dist $ABS_PATH/config/webapps

Jetzt können die lokalen Dateien als weiteres Volume in den Container eingehängt werden:

docker run -p8888:8080 --name tomkat \
-v $ABS_PATH/config/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml \
-v $ABS_PATH/config/webapps:/usr/local/tomcat/webapps \
tomcat:9.0.30-jdk11-openjdk

Wenn der Container jetzt neu gestartet wird, erscheint allerdings eine 403 Fehlermeldung. Dazu muss webapps/manager/Meta-INF/context.xml lokal angepasst werden und zwar wie auf Github beschrieben. Die Valve muss komplett auskommentiert werden. Da wir über den Docker Container auf Tomcat zugreifen und nicht von dessen localhost.

Vor jedem Neustart des Containers muss dieser gestoppt und gelöscht werden mit docker stop tomkat && docker rm tomkat

Der Container wird jetzt mit den zwei Volumes neu gestartet. Jetzt sollte auf http://localhost:8888/manager endlich die Basic Authentifizierung zu sehen sein. Done!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.