Tidak dapat menjalankan aplikasi JavaFX di buruh pelabuhan selama lebih dari beberapa menit

9

Saya mengembangkan aplikasi yang digunakan sebagai layanan komunikasi untuk aplikasi web yang terpisah. Saya memiliki 0 masalah "buruh pelabuhan" aplikasi web tetapi layanan ini terbukti menjadi mimpi buruk. Ini didasarkan pada JavaFX dan ada properti yang dapat diatur oleh pengguna dalam file konfigurasi yang membuatnya jadi aplikasi tidak menginisialisasi jendela, menu, wadah, dll. Ini mode "tanpa kepala" (tidak yakin bahwa itu benar-benar tanpa kepala ...) secara efektif mengubah aplikasi layanan menjadi layanan latar belakang. Izinkan saya juga mengawali ini dengan mengatakan bahwa aplikasi ini bekerja dengan sempurna tanpa cacat ketika dijalankan di mesin windows 10 saya dan saya telah menggunakannya di beberapa mesin lain (semuanya non-dockerized) tanpa masalah.

Inilah dockerfile yang saya buat:

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"]

Saya kemudian menggunakan perintah ini untuk membangun wadah:

docker run -t --name Some_Service -e DISPLAY=192.168.1.71:0.0 -e SERVICE_HOME= --link mySQLMD:mysql some_service

Dengan asumsi VcXsrv berjalan di PC saya, aplikasi mulai dengan benar, meskipun itu memberikan peringatan ini ketika pertama kali memulai:

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4

Masalahnya adalah itu hanya berfungsi selama 2 menit. Akhirnya wadah muncul dengan kesalahan ini dan crash:

Gdk-Message: 15:28:54.770: java: Fatal IO error 11 (Resource temporarily unavailable) on X server 192.168.1.71:0.0.

Saya mengerti pesan awal adalah karena wadah tidak memiliki driver NVidia tetapi mundur ke pipa perangkat lunak tampaknya berfungsi dengan baik. Jujur saya tidak tahu apa kesalahan fatal IO bisa disebabkan oleh. Saya telah mencoba beberapa host yang menjalankan buruh pelabuhan dan masalah yang sama terjadi.

Adakah cara untuk memperbaikinya? Lebih bagus lagi, ada ide bagaimana membuat aplikasi JavaFX SUNGGUH tanpa kepala dan bahkan tidak memerlukan hal-hal ini diinisialisasi? Saat menjalankan tanpa kepala, saya menggunakan Tugas dan semacamnya yang merupakan bagian dari JavaFX jadi saya tidak bisa tidak menggunakannya ...

Martin
sumber
Sudah mencoba bind-mount host Xserver di runtime container (mis. -v /tmp/.X11-unix:/tmp/.X11-unix)? Aplikasi yang mencoba melampirkan ke Xserver menunjukkan bahwa itu bukan "tanpa kepala", perlu meninjau implementasinya.
masseyb
coba jalankan dengan dukungan GPU. "buruh pelabuhan menjalankan -t --name Some_Service --gpus all -e DISPLAY = 192.168.1.71: 0.0 -e SERVICE_HOME = - tautan mySQLMD: mysql some_service"
arshpreet
@arshpreet ini memberi saya kesalahan ini: Respons kesalahan dari daemon: tidak dapat memilih "" driver perangkat dengan kemampuan: [[gpu]]
Martin
@ masseyb Saya menjalankan buruh pelabuhan pada mesin Windows
Martin

Jawaban:

2

Instal xvfb di wadah Anda ini buat layar virtual. ubah ke file 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 

Tambahkan bash Script baru di folder proyek Anda dan beri nama "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

Jangan lupa untuk menghapus -e DISPLAY=192.168.1.71:0.0dari perintah docker run Anda

leachim742
sumber
Bisakah Anda menunjukkan kepada saya cara mengubah titik masuk dari perintah java -jar ke perintah yang berisi pernyataan java -jar dan perintah xvfb?
Martin
Saya mencoba metode yang dijelaskan di sini: success.docker.com/article/… . Ini memberi saya kesalahan berikut: standard_init_linux.go: 211: proses pengguna exec menyebabkan "kesalahan format exec"
Martin
@ Martin saya mengedit jawaban saya, saya harap ini jelas sekarang.
leachim742
maaf saya belum pandai dengan unix :( Saya mendapatkan kesalahan ini saat menjalankan perintah docker run sekarang: / bin / sh: 1: /run.sh: tidak ditemukan
Martin
Anda perlu membuat file 'run.sh' di mana file Anda yang lain disimpan seperti snapshot.jar Anda
leachim742