LoginSignup
4
1

More than 3 years have passed since last update.

JavaFXをDockerで実行するには

Posted at

TL; DR

VcXsrvをインストールし、下記をDockerfileに追記しましょう。

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に下記のような記述が必要となります。

openjfxパッケージのインストール
RUN apt-get install openjfx

綺麗に書く場合は、次のように書くとよいでしょう。

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/323

rburgst/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 と設定してあげましょう。

環境変数DISPLAYの設定
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


まとめると、以下のような仕組みとなります。

  1. コンテナから host.docker.internal:0.0 に画面を出力
  2. コンテナ外部のVcXsrvが host.docker.internal:0.0 の受信先
  3. 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-docker

Morichan/Retuss: Real-time Ensure Traceability between UML and Source-code System
https://github.com/Morichan/Retuss

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1