让 javaFX 11 应用程序在 docker 上运行

我正在尝试让一个在我的机器上完美运行的应用程序在 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 机器上开发它,它运行良好。运行容器时,我得到以下输出

知道如何让基于 OpenJFX11 的 Java 应用程序在 Docker 中工作吗?

喵喵时光机
浏览 297回答 1
1回答

天涯尽头无女友

我终于让这个工作了!我必须在我的 Windows 主机上安装 VcXsrv 并将其添加到 docker run 命令中:-e DISPLAY=MY IP ADDRESS:0.0我的应用程序现在可以正常启动并在实际开始 Spring 初始化之前输出以下内容:Prism pipeline init order: es2 swUsing Double Precision Marlin RasterizerUsing dirty region optimizationsNot using texture mask for primitivesNot forcing power of 2 sizes for texturesUsing hardware CLAMP_TO_ZERO modeOpting in for HiDPI pixel scalingPrism pipeline name = com.sun.prism.es2.ES2PipelineLoading ES2 native library ... prism_es2    succeeded.GLFactory using com.sun.prism.es2.X11GLFactoryMESA-LOADER: failed to open swrast (search paths /usr/lib/xorg/modules/dri)libGL error: failed to load driver: swrastPrism-ES2 Error : GL_VERSION (major.minor) = 1.4(X) Got class = class com.sun.prism.es2.ES2PipelineGraphicsPipeline.createPipeline: error initializing pipeline com.sun.prism.es2.ES2Pipeline*** Fallback to Prism SW pipelinePrism pipeline name = com.sun.prism.sw.SWPipeline(X) Got class = class com.sun.prism.sw.SWPipelineInitialized prism pipeline: com.sun.prism.sw.SWPipelineMESA-LOADER: failed to open swrast (search paths /usr/lib/xorg/modules/dri)libGL error: failed to load driver: swrastvsync: true vpipe: false 仍然有一些错误我会尝试解决,但它实际上现在开始了!根据要求提供完整的 dockerfile,我仍在解决导致它回退到 prism 管道的错误,稍后将更新:FROM adoptopenjdk/openjdk11:alpineVOLUME /tmpRUN apk update && apk add libx11 mesa-gl gtk+3.0 mesa-dri-swrast mesa-demos     && apk updateADD someJar.jar someJar.jarADD lib libADD config.properties config.propertiesENTRYPOINT ["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-slimRUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa -y && apt-get updateVOLUME /tmpADD someJar.jar someJar.jarADD lib libADD config.properties config.propertiesENTRYPOINT ["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 运行命令docker run -t --name Some_Service -e DISPLAY=MY IP:0.0 -e SOME_VARIABLE= --link mySQLSRV:mysql some_service希望这对某人有帮助,这花了我几天的时间才开始工作!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java