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 ...
-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.Respostas:
Instale o xvfb no seu contêiner para criar uma tela virtual. mude para o arquivo Docker:
Adicione um novo script bash na pasta do projeto e chame-o de "run.sh"
run.sh:
Não se esqueça de remover
-e DISPLAY=192.168.1.71:0.0
do seu comando docker runfonte