数分以上、DockerでJavaFXアプリを実行できません


9

別アプリの通信サービスとして利用するアプリを開発しました。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に接続しようとしているアプリは、それが「ヘッドレス」ではないことを示唆しており、実装を確認する必要があります。
masseyb

GPUサポートで実行してみてください。"docker run -t --name Some_Service --gpus all -e DISPLAY = 192.168.1.71:0.0 -e SERVICE_HOME = --link mySQLMD:mysql some_service"
arshpreet

@arshpreetこれは私にこのエラーを与えます:デーモンからのエラー応答:機能を持つデバイスドライバー ""を選択できませんでした:[[gpu]]
Martin

@masseyb Windowsマシンでdockerを実行しています
Martin

回答:


2

コンテナーにxvfbをインストールすると、仮想画面が作成されます。Dockerファイルに変更します。

FROM openjdk:13.0.1-slim
RUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa xvfb -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
apt-get install xvfb
ENV DISPLAY=:99
ADD run.sh /run.sh
RUN chmod a+x /run.sh
CMD /run.sh 

新しいbashスクリプトをプロジェクトフォルダーに追加し、「run.sh」という名前を付けます。

run.sh:

#!/bin/bash
#remove old 
rm /tmp/.X99-lock #needed when docker container is restarted
Xvfb :99 -screen 0 640x480x8 -nolisten tcp &
java --module-path lib/javafx-sdk-13 -jar Some_Service-0.0.1-SNAPSHOT.jar

-e DISPLAY=192.168.1.71:0.0docker runコマンドから削除することを忘れないでください


エントリポイントをjava -jarコマンドからjava -jarステートメントとxvfbコマンドの両方を含むコマンドに変更する方法を教えてもらえますか?
Martin

私はここで説明されている方法を試しました:success.docker.com/article/…。これにより、次のエラーが発生します:standard_init_linux.go:211:execユーザープロセスが「exec形式エラー」を引き起こした
Martin

@Martin私は私の答えを編集しました。
leachim742

申し訳ありませんが、まだunixが苦手です:( docker runコマンドを実行すると、このエラーが発生します:/ bin / sh:1:/run.sh:not found
Martin

他のファイルがsnapshot.jarのように保存されるファイル「run.sh」を作成する必要があります
leachim742
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.