Não é possível executar o aplicativo JavaFX na janela de encaixe por mais de alguns minutos

9

Desenvolvi um aplicativo usado como serviço de comunicação para um aplicativo Web separado. Eu tive 0 problemas "encaixando" o aplicativo Web, mas o serviço está se mostrando um pesadelo. Ele é baseado no JavaFX e existe uma propriedade que pode ser definida pelo usuário no arquivo de configuração, para que o aplicativo não inicialize janelas, menus, contêineres etc. Esse modo "sem cabeça" (não tenho certeza se é realmente sem cabeça ...) efetivamente transforma o aplicativo de serviço em um serviço em segundo plano. Permita-me também dizer isso dizendo que o aplicativo funciona de maneira absolutamente perfeita quando executado na minha máquina com Windows 10 e que eu o implantei em várias outras máquinas (todas sem dockerized) sem problemas.

Aqui está o dockerfile que eu criei:

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

Eu então uso este comando para construir o contêiner:

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

Supondo que o VcXsrv esteja sendo executado no meu PC, o aplicativo é iniciado corretamente, embora emita esses avisos ao iniciar pela primeira vez:

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

O problema é que ele funciona apenas por 2 minutos. Eventualmente, o contêiner apresenta esse erro e trava:

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

Entendo que as mensagens iniciais são devidas ao contêiner que não possui driver NVidia, mas o fallback do pipeline de software parece funcionar bem. Honestamente, eu não tenho idéia do que o erro fatal de IO pode ser causado. Eu tentei em hosts diferentes executando o docker e o mesmo problema acontece.

Alguma idéia de como consertar isso? Ainda melhor, alguma idéia de como tornar um aplicativo JavaFX realmente sem cabeça e nem exigir que essas coisas sejam inicializadas? Ao executar decapitado, uso Tarefas e coisas que fazem parte do JavaFX, por isso não posso simplesmente não usá-lo ...

Martin
fonte
Já tentou montar o Xserver de hosts no tempo de execução dos contêineres (ie -v /tmp/.X11-unix:/tmp/.X11-unix)? O aplicativo que tenta se conectar ao Xserver sugere que ele não é "decapitado", precisaria revisar a implementação.
masseyb
tente executar com o suporte da GPU. "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 isso me dá este erro: Resposta de erro do daemon: não foi possível selecionar o driver de dispositivo "" com os recursos: [[gpu]]
Martin
@masseyb Estou executando o docker em uma máquina Windows
Martin

Respostas:

2

Instale o xvfb no seu contêiner para criar uma tela virtual. mude para o arquivo 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 

Adicione um novo script bash na pasta do projeto e chame-o de "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

Não se esqueça de remover -e DISPLAY=192.168.1.71:0.0do seu comando docker run

leachim742
fonte
Você pode me mostrar como alterar o ponto de entrada de um comando java -jar para um comando que contém a instrução java -jar e o comando xvfb?
Martin
Eu tentei o método descrito aqui: success.docker.com/article/… . Isso está me dando o seguinte erro: standard_init_linux.go: 211: o processo do usuário exec causou "erro de formato exec"
Martin
@ Martin eu editei minha resposta, espero que esteja claro agora.
leachim742
desculpe, ainda não sou muito bom com o unix :( Estou recebendo este erro ao executar o comando docker run agora: / bin / sh: 1: /run.sh: not found
Martin
você precisa criar o arquivo 'run.sh' onde seus outros arquivos são armazenados como o snapshot.jar
leachim742