In der Vergangenheit habe ich gerne den TV-Browser als freie Programmzeitschrift verwendet.
Leider funktioniert das Programm auf meinem neuen Laptop nicht mehr, irgendwie ist das Java bei mir nicht so installiert, wie der TV-Browser es gerne hätte und bei Versuch eines Programmstarts sehe ich lediglich dieses Fenster:
JAVA_HOME ist gesetzt, Java ist im PATH aber anscheinend fehlen dem TV-Browser die notwendigen Registry Einträge. Oder irgendwas anderes.
Also habe ich mir überlegt, ich könnte doch mal testen, das Programm in einem Docker Container laufen zu lassen.
TV-Browser im Docker Container
Das Docker Image
TV-Browser gibt es für Mac, Windows und Linux. Die Mac Version scheidet völlig aus, denn ich habe keinen Mac. Windows im Container? Nee hab ich noch nicht gemacht, gibt bestimmt Probleme. Also eine Linux Version. Ich habe die meiste Erfahrung mit Debian und Ubuntu, der Münzwurf entscheidet zur GNU/Linux Variante. Daher wird der Container auf einem Debian Linux mit Java 11 Image aufgebaut und das Dockerfile startet mit:
FROM adoptopenjdk/openjdk11:debianslim-jre
Wie ich beim Testen feststellen musste, reicht das reine Image nicht aus, es muss noch das Package "default-jre" installiert werden. Was aber leider auch nicht auf Anhieb funktioniert, zuerst muss manuell ein Verzeichnis angelegt werden. Außerdem wird noch "wget" benötigt, um die Installationsdatei herunterzuziehen.
RUN mkdir -p /usr/share/man/man1 \ && apt-get update && apt-get -y install \ default-jre \ wget \ && rm -rf /var/lib/apt/lists/*
Installation von TV-Browser im Container:
RUN wget --output-document=tvbrowser_4.2.3-1_all.deb https://sourceforge.net/projects/tvbrowser/files/TV-Browser%20Releases%20%28Java%2011%20and%20higher%29/4.2.3/tvbrowser_4.2.3-1_all.deb/download \ && dpkg -i tvbrowser_4.2.3-1_all.deb \ && rm -rf tvbrowser_4.2.3-1_all.deb
Außerdem muss noch die Timezone gesetzt werden. Diese wird mittels einer Environment Variablen gesetzt, so dass sie beim Starten des Containers ggf. auch überschrieben werden kann:
ENV TZ=Europe/Berlin RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
Abschließend muss der TV-Browser natürlich noch gestartet werden:
CMD tvbrowser
Persistenz
Ich möchte nicht bei jedem Start alle Einstellungen wieder aufs Neue vornehmen müssen, also legen wir ein Volume an:
docker volume create tvbrowser_vol
Im Container werden die Daten in /root/.config/tvbrowser gespeichert, daher lautet das mount Fragment:
docker [...] --mount source=tvbrowser_vol,destination =/root/.config/tvbrowser [...]
Todo
Leider werden so zwar einige, aber leider eben nicht alle Daten gespeichert. Damit der TV-Browser rund läuft muss hier noch nachgearbeitet werden.
Die GUI
Der TV-Browser kann jetzt im Container laufen, aber sehen tun wir erstmal nix. Dafür brauchen wir einen X Server, beispielsweise den VcXsrv Windows X Server. Downloaden, installieren und starten.
Beim Start zuerst die "Display settings" und dann den "Client startup" unverändert weiter klicken. Bei den "Extra settings" muss der access control disabled werden, andernfalls wird der Request aus dem Docker Container abgewiesen:
Es wird die IP Adresse des Windows Rechners benötig, kann man beispielsweise über den ipconfig Befehl herausfinden, bei mir war es zB 192.168.56.1, somit lautet das entsprechende Fragment für den docker Befehl:
docker [...] --rm -e DISPLAY=192.168.56.1:0.0 [...]
Die Option --rm sorgt dafür, dass der Container nach Schließen des X-Server Fensters geschlossen und removed wird.
Hätte ich statt Windows ein Linux Betriebssystem, wäre der Befehl wie folgt:
docker [...] --rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix [...]
Der Start
Der X-Server muss wie oben beschrieben gestartet sein und dann kann der TV-Browser Container über Docker gestartet werden:
docker run --rm -e DISPLAY=192.168.56.1:0.0 --name tvbrowser --mount source=tvbrowser_vol,destination =/root/.config/tvbrowser tv-browser
Falls gewünscht kann auch eine andere Zeitzone gesetzt werden:
docker [...] -e TZ=America/Los_Angeles [...]
Man kann den Container auch im Hintergrund laufen lassen, verpasst so aber die schönen Logging Ausgaben:
docker [...] --detach [...]
Resultat
Der TV-Browser läuft prinzipiell:
Allerdings kommt bei jedem Start der Konfigurations Assistent, der sich auch nicht komplett durcharbeiten lässt und abgebrochen werden muss. Die Ursache für den Fehler ist mir nicht klar, geloggt wird:
10:13:50 PM SEVERE: UNCAUGHT EXCEPTION IN THREAD 'Thread-9' java.lang.IndexOutOfBoundsException: The row index 15 must be less than or equal to 11. at jgoodies.forms/com.jgoodies.forms.layout.CellConstraints.ensureValidGridBounds(CellConstraints.java:949) at jgoodies.forms/com.jgoodies.forms.layout.FormLayout.setConstraints(FormLayout.java:821) at jgoodies.forms/com.jgoodies.forms.layout.FormLayout.addLayoutComponent(FormLayout.java:1106) at java.desktop/java.awt.Container.addImpl(Unknown Source) at java.desktop/java.awt.Container.add(Unknown Source) at jgoodies.forms/com.jgoodies.forms.builder.AbstractFormBuilder.add(AbstractFormBuilder.java:491) at jgoodies.forms/com.jgoodies.forms.builder.PanelBuilder.add(PanelBuilder.java:879) at schedulesdirectdataservice.SchedulesDirectSettingsPanel.createGui(SchedulesDirectSettingsPanel.java:216) at schedulesdirectdataservice.SchedulesDirectSettingsPanel.(SchedulesDirectSettingsPanel.java:96) at schedulesdirectdataservice.SchedulesDirectDataService.getAuthenticationPanel(SchedulesDirectDataService.java:1470) at tvbrowser/tvbrowser.core.tvdataservice.DefaultTvDataServiceProxy.getAuthenticationPanel(DefaultTvDataServiceProxy.java:302) at tvbrowser/tvbrowser.ui.configassistant.AuthenticationChannelCardPanel.createPanel(AuthenticationChannelCardPanel.java:74) at tvbrowser/tvbrowser.ui.configassistant.NetworkSuccessPanel.onNext(NetworkSuccessPanel.java:85) at tvbrowser/tvbrowser.ui.configassistant.ConfigAssistant.lambda$actionPerformed$0(ConfigAssistant.java:203) at java.base/java.lang.Thread.run(Unknown Source)
Die Senderauswahl wird gespeichert, nicht aber das heruntergeladene Programm, dieses muss also auch nach jedem Start erneut heruntergeladen werden.
Ausblick
Vermutlich durch die Verwendung des X-Servers kommt es zu der IndexOutOfBounds-Exception. Ich könnte mir den Code aus dem SVN ziehen: https://svn.code.sf.net/p/tvbrowser/code/ und dann versuchen, den Fehler zu debuggen. Also wenn ich irgendwann mal zu viel Zeit habe...
Oder ich schreibe einen Bugreport an die Entwickler, kostet aber auch Zeit, da das vermutlich ein sehr spezieller Spezialfall ist, den ich dann spezifisch beschreiben müsste, damit das überhaupt was bringt.
Alternativ kann man vermutlich auch mit dem Abbruch des Konfigurations Assistenten leben. Allerdings muss man den dann aber bei jedem Neustart wieder wegklicken, was auch irgendwie lästig ist.
Das bereits heruntergeladenes Programm "vergessen" wird ist da schon ärgerlicher. Hier müsste man den Speicherort im Container orten und über ein weiteres Volume persistieren.
In den laufenden Container kann man folgendermaßen einsteigen:
docker exec -it tvbrowser bash
Der Start ließe sich über Docker-Compose etwas vereinfachen, in das Script (YML-File) kann man alle Environment Variablen, Volumes etc. eintragen.
Sobald die Probleme behoben sind, könnte ich den Dockerfile/Docker-Compose Code in ein GIT Repository, und das Image in die Docker Registry hochladen.
Die Lösung
Nachdem ich mit dem TV-Browser im Docker Container herumgespielt hatte, habe ich nochmal einen Versuch über den "herkömmlichen" Weg gewagt und das Sorglospaket (Java enthalten) heruntergezogen und installiert. Und siehe da: Der TV-Browser läuft auf meinem Windows Rechner ganz ohne Docker!
Conclusio
Interessant war das ganze natürlich trotzdem! Aber ob ich nochmal an dem Projekt weiter arbeiten werde glaube ich eher nicht. Dafür gibt es noch zu viele andere spannende Projekte 😉