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 ...
-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.