Không thể chạy ứng dụng JavaFX trên docker trong hơn một vài phút


9

Tôi đã phát triển một ứng dụng được sử dụng như một dịch vụ truyền thông cho một ứng dụng web riêng biệt. Tôi đã có 0 vấn đề "cập bến" ứng dụng web nhưng dịch vụ này đang chứng tỏ là một cơn ác mộng. Nó dựa trên JavaFX và có một thuộc tính mà người dùng có thể đặt trong tệp cấu hình khiến ứng dụng không khởi tạo bất kỳ cửa sổ, menu, thùng chứa, v.v. Chế độ "không đầu" này (không chắc đó là thật không đầu ...) thực sự biến ứng dụng dịch vụ thành dịch vụ nền. Tôi cũng nói trước điều này bằng cách nói rằng ứng dụng hoạt động hoàn hảo khi chạy trên máy windows 10 của tôi và tôi đã triển khai nó trên một số máy khác (tất cả đều không được cập nhật) mà không gặp vấn đề gì.

Đây là dockerfile tôi nghĩ ra:

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

Sau đó tôi sử dụng lệnh này để xây dựng container:

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

Giả sử VcXsrv đang chạy trên PC của tôi, ứng dụng sẽ khởi động chính xác, mặc dù nó đưa ra những cảnh báo này khi lần đầu tiên bắt đầu:

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

Vấn đề là nó chỉ hoạt động trong 2 phút. Cuối cùng, container xuất hiện lỗi này và gặp sự cố:

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

Tôi hiểu các thông báo ban đầu là do container không có trình điều khiển NVidia nhưng dự phòng cho đường ống phần mềm dường như hoạt động tốt. Thành thật mà nói tôi không biết lỗi IO gây tử vong có thể gây ra. Tôi đã thử trên các máy chủ khác nhau chạy docker và vấn đề tương tự xảy ra.

Bất kỳ ý tưởng làm thế nào để khắc phục điều này? Thậm chí tốt hơn, có ý tưởng nào để làm cho ứng dụng JavaFX TRULY không đầu và thậm chí không yêu cầu bất kỳ nội dung nào trong số này được khởi tạo không? Khi chạy không đầu, tôi sử dụng Nhiệm vụ và đó là một phần của JavaFX vì vậy tôi không thể không sử dụng nó ...


Bạn đã thử gắn kết máy chủ Xserver trong thời gian chạy container (tức là -v /tmp/.X11-unix:/tmp/.X11-unix) chưa? Ứng dụng cố gắng đính kèm vào Xserver cho thấy rằng nó không "không đầu", sẽ cần phải xem lại việc thực hiện.
masseyb

cố gắng chạy với sự hỗ trợ GPU. "Docker chạy -t --name Some_Service --gpus tất cả DISPLAY -e = 192.168.1.71: 0.0 -e SERVICE_HOME = --Liên mySQLMD: some_service mysql"
arshpreet

@arshpreet điều này mang lại cho tôi lỗi này: Lỗi phản hồi từ daemon: không thể chọn trình điều khiển thiết bị "" với các khả năng: [[gpu]]
Martin

@masseyb Tôi đang chạy docker trên máy Windows
Martin

Câu trả lời:


2

Cài đặt xvfb trong thùng chứa của bạn để tạo màn hình ảo. thay đổi tập tin 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 

Thêm bash Script mới trong thư mục dự án của bạn và đặt tên là "run.sh"

chạy.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

Đừng quên xóa -e DISPLAY=192.168.1.71:0.0khỏi lệnh chạy docker của bạn


Bạn có thể chỉ cho tôi cách thay đổi điểm vào từ lệnh java -jar thành lệnh chứa cả câu lệnh java -jar và lệnh xvfb không?
Martin

Tôi đã thử phương pháp được mô tả ở đây: thành công.docker.com / article / . Điều này mang lại cho tôi lỗi sau: standard_init_linux.go: 211: quá trình người dùng exec gây ra "lỗi định dạng exec"
Martin

@Martin tôi đã chỉnh sửa câu trả lời của tôi, tôi hy vọng nó rõ ràng ngay bây giờ.
leachim742

xin lỗi tôi không phải là rất tốt với unix chưa :( Tôi nhận được lỗi này khi thực hiện lệnh Docker chạy bây giờ: / bin / sh: 1: /run.sh: không tìm thấy
Martin

bạn cần tạo tệp 'run.sh' nơi các tệp khác của bạn được lưu trữ như snapshot.jar
leachim742
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.