도커에서 JavaFX 앱을 몇 분 이상 실행할 수 없습니다.


9

별도의 웹 앱을위한 통신 서비스로 사용되는 응용 프로그램을 개발했습니다. 웹 응용 프로그램을 "독점"하는 0 문제가 있었지만 서비스는 악몽으로 판명되었습니다. JavaFX를 기반으로하며 구성 파일에서 사용자가 설정할 수있는 속성이 있으므로 앱이 창, 메뉴, 컨테이너 등을 초기화하지 않도록합니다.이 "헤드리스"모드 (정확하지는 않습니다) headless ...)는 효과적으로 서비스 앱을 백그라운드 서비스로 바꿉니다. 또한 Windows 10 컴퓨터에서 실행될 때 앱이 완벽하게 작동하고 문제없이 다른 모든 컴퓨터 (도킹되지 않은)에 배포했다고 말 함으로써이 서문을 시작하겠습니다.

다음은 내가 만든 도커 파일입니다.

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

그런 다음이 명령을 사용하여 컨테이너를 만듭니다.

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

VcXsrv가 내 PC에서 실행되고 있다고 가정하면 앱이 처음 시작될 때 이러한 경고가 표시되지만 앱이 올바르게 시작됩니다.

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

문제는 2 분 동안 만 작동한다는 것입니다. 결국 컨테이너 에이 오류가 발생하고 충돌합니다.

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

초기 메시지는 NVidia 드라이버가없는 컨테이너로 인한 것이지만 소프트웨어 파이프 라인으로의 대체는 잘 작동하는 것으로 보입니다. 솔직히 나는 치명적인 IO 오류가 어떤 원인 일 수 있는지 전혀 모른다. 도커를 실행하는 다른 호스트에서 시도했지만 동일한 문제가 발생합니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 더 좋은 점은 JavaFX 앱을 헤드리스로 만드는 방법에 대한 아이디어가 있으며 초기화 할 필요조차 없습니까? 헤드리스를 실행할 때 작업과 JavaFX의 일부를 사용하므로 사용할 수 없습니다 ...


컨테이너 런타임에서 호스트 Xserver를 바인드 마운트하려고 했습니까 (예 :) -v /tmp/.X11-unix:/tmp/.X11-unix? Xserver에 연결하려는 앱은 "헤드리스"가 아니며 구현을 검토해야한다고 제안합니다.
masseyb

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이 오류가 발생합니다. 데몬의 오류 응답 : 기능이있는 장치 드라이버 ""을 (를) 선택할 수 없습니다 : [[gpu]]
Martin

@masseyb 저는 Windows 컴퓨터에서 docker를 실행하고 있습니다
Martin

답변:


2

컨테이너에 xvfb를 설치하면 가상 화면이 생성됩니다. 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 

프로젝트 폴더에 새 bash 스크립트를 추가하고 이름을 "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

-e DISPLAY=192.168.1.71:0.0docker run 명령에서 제거 하는 것을 잊지 마십시오


시작점을 java -jar 명령에서 java -jar 문과 xvfb 명령을 모두 포함하는 명령으로 변경하는 방법을 보여줄 수 있습니까?
Martin

: 나는 방법이 여기에 설명 된 시도 success.docker.com/article/...을 . standard_init_linux.go : 211 : exec 사용자 프로세스로 인해 "exec 형식 오류"가 발생했습니다
Martin

@Martin 나는 내 대답을 편집했다.
leachim742

죄송하지만 아직 유닉스와 잘 어울리지 않습니다 :( 지금 docker run 명령을 수행 할 때이 오류가 발생합니다 : / bin / sh : 1 : /run.sh : 찾을 수 없음
Martin

당신은 파일을 다른 파일이 사용자의 snapshot.jar처럼 저장되어있는 'run.sh'만들 필요
leachim742
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.