私のマシンで完全に機能するアプリケーションをdockerで実行しようとしています。これが私のdockerファイルです。
FROM openjdk:11-jre-slim
VOLUME /tmp
ADD someJar.jar someJar.jar
ADD lib lib
ADD config.properties config.properties
ENTRYPOINT ["Java", "-javaagent:lib/aspectjweaver-1.9.2.jar",
"-javaagent:lib/spring-instrument-5.1.6.RELEASE.jar", "--module-path",
"lib/javafx-sdk-11.0.2", "--add-modules=javafx.controls", "-
Dprism.verbose=true", "-jar","someJar.jar"]
私はまた、Alpine openjdk11リリースをベースにして同じ結果を得ようとしました:
FROM adoptopenjdk/openjdk11:Alpine
VOLUME /tmp
RUN apk update && apk add libx11 mesa-gl gtk+3.0 && apk update
ADD someJar.jar someJar.jar
ADD lib lib
ADD config.properties config.properties
ENTRYPOINT ["Java", "-javaagent:lib/aspectjweaver-1.9.2.jar", "-javaagent:lib/spring-instrument-5.1.6.RELEASE.jar", "--module-path", "lib", "--add-modules=javafx.controls", "-Dprism.verbose=true", "-jar","someJar.jar"]
Libフォルダーには、openJFXランタイムのLinuxフレーバー(.soファイルと.jarファイル)が含まれています。これは、openJDKランタイムに相当するWindowsを搭載したWindowsマシンで開発しており、完全に機能します。コンテナを実行すると、次の出力が得られます。
Prism pipeline init order: es2 sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.Sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
GraphicsPipeline.createPipeline failed for com.Sun.prism.es2.ES2Pipeline
Java.lang.UnsatisfiedLinkError: no prism_es2 in Java.library.path: [/usr/Java/packages/lib, /usr/lib/x86_64-linux-gnu/jni, /lib/x86_64-linux-gnu, /usr/lib/x86_64-linux-gnu, /usr/lib/jni, /lib, /usr/lib]
at Java.base/Java.lang.ClassLoader.loadLibrary(ClassLoader.Java:2660)
at Java.base/Java.lang.Runtime.loadLibrary0(Runtime.Java:829)
at Java.base/Java.lang.System.loadLibrary(System.Java:1867)
at javafx.graphics/com.Sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.Java:150)
at javafx.graphics/com.Sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.Java:52)
at javafx.graphics/com.Sun.prism.es2.ES2Pipeline.lambda$static$0(ES2Pipeline.Java:68)
at Java.base/Java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.Sun.prism.es2.ES2Pipeline.<clinit>(ES2Pipeline.Java:50)
at Java.base/Java.lang.Class.forName0(Native Method)
at Java.base/Java.lang.Class.forName(Class.Java:315)
at javafx.graphics/com.Sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.Java:187)
at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.Java:91)
at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.Java:124)
at Java.base/Java.lang.Thread.run(Thread.Java:834)
*** Fallback to Prism SW pipeline
Prism pipeline name = com.Sun.prism.sw.SWPipeline
(X) Got class = class com.Sun.prism.sw.SWPipeline
Initialized prism pipeline: com.Sun.prism.sw.SWPipeline
Exception in thread "main" Java.lang.reflect.InvocationTargetException
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.base/Java.lang.reflect.Method.invoke(Method.Java:566)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.Java:47)
at org.springframework.boot.loader.Launcher.launch(Launcher.Java:86)
at org.springframework.boot.loader.Launcher.launch(Launcher.Java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.Java:51)
Caused by: Java.lang.UnsupportedOperationException: Unable to open DISPLAY
at javafx.graphics/com.Sun.glass.ui.gtk.GtkApplication.lambda$new$6(GtkApplication.Java:173)
at Java.base/Java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.Sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.Java:171)
at javafx.graphics/com.Sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.Java:41)
at javafx.graphics/com.Sun.glass.ui.Application.run(Application.Java:144)
at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.Java:258)
at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:269)
at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:158)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.Java:658)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:678)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.Java:195)
at Java.base/Java.lang.Thread.run(Thread.Java:834)
OpenJFX11ベースのJavaアプリをDockerで動作させる方法を教えてください。)
******更新******
私はこれについていくらか進歩を遂げました。私のopenJFXランタイムファイルをlibフォルダーに直接配置すると、少しだけ進行することがわかりました。新しいエラーはこれになりました:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
少し調べた後、このRUNコマンドをdockerfileに追加しました:
RUN apt-get update && apt-get install libgl1-mesa-glx -y
これは私に新しいスタックトレースを与えます:
Prism pipeline init order: es2 sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.Sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
succeeded.
GLFactory using com.Sun.prism.es2.X11GLFactory
(X) Got class = class com.Sun.prism.es2.ES2Pipeline
GraphicsPipeline.createPipeline: error initializing pipeline
com.Sun.prism.es2.ES2Pipeline
*** Fallback to Prism SW pipeline
Prism pipeline name = com.Sun.prism.sw.SWPipeline
(X) Got class = class com.Sun.prism.sw.SWPipeline
Initialized prism pipeline: com.Sun.prism.sw.SWPipeline
Exception in thread "main" Java.lang.reflect.InvocationTargetException
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.base/Java.lang.reflect.Method.invoke(Method.Java:566)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.Java:47)
at org.springframework.boot.loader.Launcher.launch(Launcher.Java:86)
at org.springframework.boot.loader.Launcher.launch(Launcher.Java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.Java:51)
Caused by: Java.lang.UnsupportedOperationException: Unable to open DISPLAY
at javafx.graphics/com.Sun.glass.ui.gtk.GtkApplication.lambda$new$6(GtkApplication.Java:173)
at Java.base/Java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.Sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.Java:171)
at javafx.graphics/com.Sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.Java:41)
at javafx.graphics/com.Sun.glass.ui.Application.run(Application.Java:144)
at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.Java:258)
at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:269)
at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:158)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.Java:658)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:678)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.Java:195)
at Java.base/Java.lang.Thread.run(Thread.Java:834)
******別の更新******
GtkApplication.classファイルのJavaFXコードを掘り下げて、これが失敗しているセクションです。
int libraryToLoad = _queryLibrary(gtkVersion, gtkVersionVerbose);
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
if (libraryToLoad == QUERY_NO_DISPLAY) {
throw new UnsupportedOperationException("Unable to open DISPLAY");
} else if (libraryToLoad == QUERY_USE_CURRENT) {
if (gtkVersionVerbose) {
System.out.println("Glass GTK library to load is already loaded");
}
} else if (libraryToLoad == QUERY_LOAD_GTK2) {
if (gtkVersionVerbose) {
System.out.println("Glass GTK library to load is glassgtk2");
}
NativeLibLoader.loadLibrary("glassgtk2");
} else if (libraryToLoad == QUERY_LOAD_GTK3) {
if (gtkVersionVerbose) {
System.out.println("Glass GTK library to load is glassgtk3");
}
NativeLibLoader.loadLibrary("glassgtk3");
} else {
throw new UnsupportedOperationException("Internal Error");
}
return null;
});
ライブラリーがないか何かありますか?
... 助けて?
ありがとう
ようやくこれが機能しました!私はWindowsホストにVcXsrvをインストールし、これをdocker runコマンドに追加する必要がありました。
-e DISPLAY=MY IP ADDRESS:0.0
私のアプリは正常に起動し、実際にSpringの初期化を開始する前に以下を出力します。
Prism pipeline init order: es2 sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.Sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
succeeded.
GLFactory using com.Sun.prism.es2.X11GLFactory
MESA-LOADER: failed to open swrast (search paths /usr/lib/xorg/modules/dri)
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4
(X) Got class = class com.Sun.prism.es2.ES2Pipeline
GraphicsPipeline.createPipeline: error initializing pipeline com.Sun.prism.es2.ES2Pipeline
*** Fallback to Prism SW pipeline
Prism pipeline name = com.Sun.prism.sw.SWPipeline
(X) Got class = class com.Sun.prism.sw.SWPipeline
Initialized prism pipeline: com.Sun.prism.sw.SWPipeline
MESA-LOADER: failed to open swrast (search paths /usr/lib/xorg/modules/dri)
libGL error: failed to load driver: swrast
vsync: true vpipe: false
まだ試行錯誤するいくつかのエラーがありますが、実際には今から始まります!
リクエストに応じて完全なdockerfile、私はまだそれをプリズムパイプラインにフォールバックさせる原因となっているエラーに取り組んでいます、後で更新されます:
FROM adoptopenjdk/openjdk11:Alpine
VOLUME /tmp
RUN apk update && apk add libx11 mesa-gl gtk+3.0 mesa-dri-swrast mesa-demos
&& apk update
ADD someJar.jar someJar.jar
ADD lib lib
ADD config.properties config.properties
ENTRYPOINT ["Java", "-javaagent:lib/aspectjweaver-1.9.2.jar", "-javaagent:lib/spring-instrument-5.1.6.RELEASE.jar", "--module-path", "lib", "--add-modules=javafx.controls", "-Dprism.verbose=true", "-Djava.awt.headless=true", "-jar","someJar.jar"]
******最終設定******
私はlibGLエラーを掘り下げました。ES2パイプラインを機能させる手間は、私のニーズにとってはそれだけの価値もありません。 NvidiaとCUDAドライバーをいじる必要があり、私のアプリはとにかくバックグラウンドサービスにすぎないので、まったく役に立ちません。すべてが機能するための最終的なセットアップは次のとおりです。
Dockerfile(他のアプリとの一貫性を保つためにopenjdkに切り替えて、インストールする必要のある最小限のパッケージを見つけました)
FROM openjdk:11-jre-slim
RUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa -y && apt-get update
VOLUME /tmp
ADD someJar.jar someJar.jar
ADD lib lib
ADD config.properties config.properties
ENTRYPOINT ["Java", "-javaagent:lib/aspectjweaver-1.9.2.jar", "-javaagent:lib/spring-instrument-5.1.6.RELEASE.jar", "--module-path", "lib/javafx-sdk-11.0.2", "-jar", "someJar.jar"]
Dockerビルドコマンド
docker build -f Dockerfile -t some_service .
Docker runコマンド
docker run -t --name Some_Service -e DISPLAY=MY IP:0.0 -e SOME_VARIABLE= --link mySQLSRV:mysql some_service
これが誰かの役に立てば幸いです。これが機能するまでに数日かかりました。