Saya mengembangkan aplikasi yang digunakan sebagai layanan komunikasi untuk aplikasi web yang terpisah. Saya memiliki 0 masalah "buruh pelabuhan" aplikasi web tetapi layanan ini terbukti menjadi mimpi buruk. Ini didasarkan pada JavaFX dan ada properti yang dapat diatur oleh pengguna dalam file konfigurasi yang membuatnya jadi aplikasi tidak menginisialisasi jendela, menu, wadah, dll. Ini mode "tanpa kepala" (tidak yakin bahwa itu benar-benar tanpa kepala ...) secara efektif mengubah aplikasi layanan menjadi layanan latar belakang. Izinkan saya juga mengawali ini dengan mengatakan bahwa aplikasi ini bekerja dengan sempurna tanpa cacat ketika dijalankan di mesin windows 10 saya dan saya telah menggunakannya di beberapa mesin lain (semuanya non-dockerized) tanpa masalah.
Inilah dockerfile yang saya buat:
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"]
Saya kemudian menggunakan perintah ini untuk membangun wadah:
docker run -t --name Some_Service -e DISPLAY=192.168.1.71:0.0 -e SERVICE_HOME= --link mySQLMD:mysql some_service
Dengan asumsi VcXsrv berjalan di PC saya, aplikasi mulai dengan benar, meskipun itu memberikan peringatan ini ketika pertama kali memulai:
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4
Masalahnya adalah itu hanya berfungsi selama 2 menit. Akhirnya wadah muncul dengan kesalahan ini dan crash:
Gdk-Message: 15:28:54.770: java: Fatal IO error 11 (Resource temporarily unavailable) on X server 192.168.1.71:0.0.
Saya mengerti pesan awal adalah karena wadah tidak memiliki driver NVidia tetapi mundur ke pipa perangkat lunak tampaknya berfungsi dengan baik. Jujur saya tidak tahu apa kesalahan fatal IO bisa disebabkan oleh. Saya telah mencoba beberapa host yang menjalankan buruh pelabuhan dan masalah yang sama terjadi.
Adakah cara untuk memperbaikinya? Lebih bagus lagi, ada ide bagaimana membuat aplikasi JavaFX SUNGGUH tanpa kepala dan bahkan tidak memerlukan hal-hal ini diinisialisasi? Saat menjalankan tanpa kepala, saya menggunakan Tugas dan semacamnya yang merupakan bagian dari JavaFX jadi saya tidak bisa tidak menggunakannya ...
-v /tmp/.X11-unix:/tmp/.X11-unix
)? Aplikasi yang mencoba melampirkan ke Xserver menunjukkan bahwa itu bukan "tanpa kepala", perlu meninjau implementasinya.Jawaban:
Instal xvfb di wadah Anda ini buat layar virtual. ubah ke file Docker:
Tambahkan bash Script baru di folder proyek Anda dan beri nama "run.sh"
run.sh:
Jangan lupa untuk menghapus
-e DISPLAY=192.168.1.71:0.0
dari perintah docker run Andasumber