ไม่สามารถเรียกใช้แอป JavaFX ที่ docker ได้นานกว่าสองสามนาที


9

ฉันพัฒนาแอปพลิเคชั่นที่ใช้เป็นบริการสื่อสารสำหรับเว็บแอปแยกต่างหาก ฉันมีปัญหา 0 ข้อที่ "เทียบเคียง" แอปพลิเคชันเว็บ แต่บริการกำลังพิสูจน์แล้วว่าเป็นฝันร้าย มันขึ้นอยู่กับ JavaFX และมีคุณสมบัติที่ผู้ใช้สามารถตั้งค่าได้ในไฟล์ปรับแต่งที่ทำให้แอปไม่เริ่มต้น windows, เมนู, คอนเทนเนอร์, ฯลฯ โหมด "หัวขาด" นี้ (ไม่แน่ใจว่าเป็นจริง หัวขาด ... ) เปลี่ยนแอปบริการเป็นบริการพื้นหลังอย่างมีประสิทธิภาพ ให้ฉันนำหน้านี้ด้วยการบอกว่าแอพทำงานได้อย่างไร้ที่ติเมื่อทำงานบนเครื่อง 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

สมมติว่า 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 ร้ายแรงอาจเกิดจาก ฉันได้ลองกับโฮสต์อื่น ๆ ที่รันนักเทียบท่าแล้วและเกิดปัญหาเดียวกัน

ความคิดวิธีการแก้ไขปัญหานี้? ยิ่งไปกว่านั้นความคิดใด ๆ ที่จะทำให้แอป JavaFX มีความไร้สมองและไม่จำเป็นต้องมีการเริ่มต้นสิ่งใดเลย เมื่อใช้งานแบบไม่ใช้หัวฉันใช้งานและเป็นส่วนหนึ่งของ JavaFX ดังนั้นฉันจึงไม่สามารถใช้งาน ...


ได้ลองผูกโฮสต์ Xserver ในคอนเทนเนอร์ runtime (เช่น-v /tmp/.X11-unix:/tmp/.X11-unix)? แอพที่พยายามแนบกับ Xserver แนะนำว่าไม่ใช่ "หัวขาด" จะต้องตรวจสอบการใช้งาน
masseyb

พยายามเรียกใช้ด้วยการสนับสนุน GPU "นักเทียบท่าวิ่ง -t - ชื่อ Some_Service - gpus all -e DISPLAY = 192.168.1.71: 0.0 -e SERVICE_HOME = - เชื่อมโยง mySQLMD: mysql some_service"
arshpreet

@arshpreet สิ่งนี้ทำให้ฉันมีข้อผิดพลาดนี้: การตอบสนองข้อผิดพลาดจาก daemon: ไม่สามารถเลือกไดรเวอร์อุปกรณ์ "" ที่มีความสามารถ: [[gpu]]
Martin

@masseyb ฉันกำลังเรียกใช้นักเทียบท่าบนเครื่อง Windows
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 Script ใหม่ในโฟลเดอร์โครงการของคุณและตั้งชื่อว่า "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.0จากคำสั่งเรียกใช้นักเทียบท่าของคุณ


คุณสามารถแสดงวิธีเปลี่ยน entry point จากคำสั่ง java -jar เป็นคำสั่งที่มีทั้งคำสั่ง java -jar และคำสั่ง xvfb ได้หรือไม่?
Martin

ฉันพยายามวิธีการอธิบายที่นี่: success.docker.com/article/... นี่ทำให้ฉันมีข้อผิดพลาดต่อไปนี้: standard_init_linux.go: 211: กระบวนการผู้ใช้ exec เกิดจาก "error format exec"
Martin

@ มาร์ตินฉันแก้ไขคำตอบของฉันฉันหวังว่ามันชัดเจนตอนนี้
leachim742

ขอโทษฉันไม่ดีมากกับยูนิกซ์ยัง :( ฉันได้รับข้อผิดพลาดนี้เมื่อทำคำสั่งนักเทียบท่าวิ่งขณะนี้: bin / sh /: 1: /run.sh: ไม่พบ
มาร์ติน

คุณต้องสร้างไฟล์ 'run.sh' ที่เก็บไฟล์อื่น ๆ ของคุณเช่น snapshot.jar
leachim742
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.