別アプリの通信サービスとして利用するアプリを開発しました。Webアプリの「ドッキング」に問題はありませんでしたが、サービスが悪夢であることが判明しています。これはJavaFXに基づいており、ユーザーが設定ファイルで設定できるプロパティがあるため、アプリはウィンドウ、メニュー、コンテナなどを初期化しません。この「ヘッドレス」モード(本当にheadless ...)サービスアプリをバックグラウンドサービスに効果的に変換します。また、Windows 10マシンで実行するとアプリは完全に問題なく動作し、他のいくつかのマシン(すべてドッキングされていない)に問題なくデプロイしたと言って、これを前置きします。
ここに私が思いついたdockerfileがあります:
FROM openjdk:13.0.1-slim
RUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa -y && apt-get update
VOLUME /tmp
ADD Some_Service-0.0.1-SNAPSHOT.jar Some_Service-0.0.1-SNAPSHOT.jar
ADD lib lib
ADD config.properties config.properties
ENTRYPOINT ["java", "--module-path", "lib/javafx-sdk-13", "-jar", "Some_Service-0.0.1-SNAPSHOT.jar"]
次に、このコマンドを使用してコンテナーをビルドします。
docker run -t --name Some_Service -e DISPLAY=192.168.1.71:0.0 -e SERVICE_HOME= --link mySQLMD:mysql some_service
PCでVcXsrvが実行されていると仮定すると、アプリは正しく起動しますが、最初の起動時に次の警告が表示されます。
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4
問題は、2分間しか機能しないことです。最終的に、コンテナはこのエラーを出してクラッシュします:
Gdk-Message: 15:28:54.770: java: Fatal IO error 11 (Resource temporarily unavailable) on X server 192.168.1.71:0.0.
最初のメッセージはコンテナーにNVidiaドライバーがないためであると理解していますが、ソフトウェアパイプラインへのフォールバックは正常に機能しているようです。正直なところ、致命的なIOエラーの原因が何なのかわかりません。dockerを実行している別のホストで試したところ、同じ問題が発生しました。
これを修正する方法はありますか?さらに良いことに、JavaFXアプリを完全にヘッドレスにして、初期化する必要がないようにする方法はありますか?ヘッドレスで実行しているときは、JavaFXの一部であるタスクなどを使用しているので、使用できないだけではありません...
-v /tmp/.X11-unix:/tmp/.X11-unix
)でホストXserverをバインドマウントしようとしましたか?Xserverに接続しようとしているアプリは、それが「ヘッドレス」ではないことを示唆しており、実装を確認する必要があります。