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