TL; DR
VcXsrvをインストールし、下記をDockerfileに追記しましょう。
ENV DISPLAY host.docker.internal:0.0
RUN apt-get install openjfx
はじめに
JavaFXアプリケーションをDockerコンテナ内で実行したい!
そう思う方は多いと思います。
私もその1人です。
その際に、いくつかの問題点にぶつかりました。
- openjdkのベースイメージだけだとビルドが通らない
- どうやってコンテナ内のGUI画面をコンテナ外に出すのかわからない
ここでは、上記の問題を解決します。
openjdkのベースイメージだけだとビルドが通らない
openjfxパッケージをインストールする必要があります。
OracleJDKとOpenJDKに分割されたJava9以降、OpenJDKにJavaFXのパッケージは含まれなくなりました。
本来であれば、openjdkパッケージおよびopenjfxパッケージをサラのベースイメージに導入すべきですが、openjdkが公開しているベースイメージに、openjfxパッケージは含まれていません。
Dockerfileに下記のような記述が必要となります。
RUN apt-get install openjfx
綺麗に書く場合は、次のように書くとよいでしょう。
RUN apt-get update && \
apt-get install -y --no-install-recommends \
openjfx \
&& \
rm -rf /var/lib/apt/lists/*
OpenJFX can not be used anymore · Issue #323 · docker-library/openjdk
https://github.com/docker-library/openjdk/issues/323rburgst/java8-openjfx-docker: openjdk8 container including openjfx
https://github.com/rburgst/java8-openjfx-docker
どうやってコンテナ内のGUI画面をコンテナ外に出すのかわからない
コンテナ内部の画面は、コンテナ内部にしか表示されません。
ということは、コンテナ外部から見ることは、通常であれば不可能ということになります。
しかしそこはDocker、何もしていないわけではありません。
コンテナ内部のGUI画面をコンテナ外部に出力する方法があります。
詳細は、下記Webページを参照してください。
VcXsrvのインストール
VcXsrvをインストールします。
このソフトウェアは、X-Serverのエミュレータのようなものらしく、WSLのGUIアプリを表示できたりするものです。
WSLとVcXsrvでLinuxのGUIをWin10で表示する
https://www.usagi1975.com/201903021706/
環境変数DISPLAYの設定
環境変数DISPLAYは、コンテナ内部のx window systemが表示するGUI画面の出力先です。
これを、 host.docker.internal:0.0
と設定してあげましょう。
ENV DISPLAY host.docker.internal:0.0
Docker for windowsのコンテナ内でGUIアプリを実行 - FILES=0
https://fileszero.kimurak.net/2019-04-18-docker-and-gui-on-windows/DISPLAY - なんなんなん行く?
https://sites.google.com/site/teyasn001/ubuntu-12-10/huan-jing-bian-shudisplayローカルからリモートのXサーバにウィンドウを飛ばす - Qiita
https://qiita.com/kkk627/items/8db34266722488eae412
まとめると、以下のような仕組みとなります。
- コンテナから
host.docker.internal:0.0
に画面を出力 - コンテナ外部のVcXsrvが
host.docker.internal:0.0
の受信先 - VcXsrvが画面上にGUI画面を出力
おわりに
僕の作成したJavaFXアプリはGradle製ですので、下記のような作りとなります。
FROM gradle:5.5-jdk11
ENV DISPLAY host.docker.internal:0.0
RUN apt-get update && \
apt-get install -y --no-install-recommends \
openjfx \
&& \
rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/morichan/retuss.git
WORKDIR retuss
RUN gradle build
CMD ["gradle", "run"]
参考にしてみて下さい。
docker-images/retuss-docker at master · Morichan/docker-images
https://github.com/Morichan/docker-images/tree/master/retuss-dockerMorichan/Retuss: Real-time Ensure Traceability between UML and Source-code System
https://github.com/Morichan/Retuss