JavaFX uygulaması docker'da birkaç dakikadan fazla çalıştırılamıyor


9

Ayrı bir web uygulaması için iletişim hizmeti olarak kullanılan bir uygulama geliştirdim. Web sorunları "dockerizing" 0 sorunları vardı ama hizmet bir kabus olduğunu kanıtlıyor. JavaFX tabanlıdır ve kullanıcı tarafından yapılandırma dosyasında ayarlanabilen bir özellik vardır, böylece uygulama herhangi bir pencere, menü, kap, vb. Başlatmaz. Bu "başsız" mod (gerçekten olduğundan emin değilim headless ...) etkin bir şekilde hizmet uygulamasını bir arka plan hizmetine dönüştürür. Ben de app benim windows 10 makinede çalışırken kesinlikle kusursuz çalışır ve ben herhangi bir sorun ile diğer tüm makinelerde (hepsi dockerized) dağıttı söyleyerek bunu önsöz edelim.

İşte geldi 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"]

Daha sonra kapsayıcı oluşturmak için bu komutu kullanın:

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

VcXsrv'nin bilgisayarımda çalıştığını varsayarsak, uygulama ilk başlatıldığında bu uyarıları vermesine rağmen doğru şekilde başlatılır:

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

Sorun şu ki, sadece 2 dakika boyunca çalışıyor. Sonunda kapsayıcı bu hatayı bulur ve çöker:

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

İlk mesajların NVidia sürücüsü olmayan kaptan kaynaklandığını anlıyorum, ancak yazılım boru hattına geri dönüş iyi çalışıyor gibi görünüyor. Dürüst olmak gerekirse, ölümcül IO hatasının neden olabileceği hakkında hiçbir fikrim yok. Docker çalıştıran farklı ana bilgisayarlar denedim ve aynı sorun olur.

Bunu nasıl düzeltebileceğine dair bir fikrin var mı? Daha da iyisi, bir JavaFX uygulamasını GERÇEKTEN nasıl başsız hale getireceğiniz ve bu şeylerden herhangi birinin başlatılmasını gerektirmeyen herhangi bir fikir? Başsız çalışırken, JavaFX'in bir parçası olan Görevler'i kullanıyorum, bu yüzden kullanamıyorum ...


Xserver ana bilgisayarlarını kapsayıcı çalışma süresine (yani -v /tmp/.X11-unix:/tmp/.X11-unix) bağlama işlemini denediniz mi? Xserver'a bağlanmaya çalışan uygulama, "başsız" olmadığını, uygulamayı gözden geçirmesi gerektiğini gösteriyor.
masseyb

GPU desteği ile çalıştırmayı deneyin. "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 bu bana şu hatayı veriyor: Daemon'dan gelen hata yanıtı: "" özellikli aygıt sürücüsünü seçemedi: [[gpu]]
Martin

@masseyb Bir Windows makinesinde liman işçisi çalıştırıyorum
Martin

Yanıtlar:


2

Bu sanal bir ekran oluşturmak konteyner xvfb yükleyin. Docker dosyasına değiştir:

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 

Proje klasörünüze yeni bash Script ekleyin ve "run.sh" olarak adlandırın

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 çalıştırma komutunuzdan kaldırmayı unutmayın


Java -jar komutundan hem java -jar deyimini hem de xvfb komutunu içeren bir komuta giriş noktasının nasıl değiştirileceğini gösterebilir misiniz?
Martin

Burada açıklanan yöntemi denedim: success.docker.com/article/… . Bu bana şu hatayı veriyor: standard_init_linux.go: 211: exec kullanıcı işlemi "exec format hatası" na neden oldu
Martin

@Martin cevabımı düzenledim umarım şimdi açıktır.
leachim742

üzgünüm henüz unix ile çok iyi değilim :( Şimdi docker run komutunu yaparken bu hatayı alıyorum: / bin / sh: 1: /run.sh: bulunamadı
Martin

diğer dosyalarınızın snapshot.jar gibi depolandığı 'run.sh' dosyasını oluşturmanız gerekir
leachim742 21
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.