📟

WSL2上のコンテナからWSLgを使用する

2023/02/07に公開

WSL2上でDockerコンテナ内からWSLgを使用してGUIアプリケーションを表示するときの手順をまとめました。

コンテナ作成

WSLgをコンテナ内から使用するには、以下のディレクトリをマウントして、環境変数を設定する必要があります。[1]

サーバ マウント 環境変数
X11 /tmp/.X11-unix DISPLAY
Wayland /mnt/wslg WAYLAND_DISPLAY, XDG_RUNTIME_DIR

X11アプリケーションはXWaylandで処理されるのでX11/Waylandどちらのアプリケーションも動作します。
WSLgのアーキテクチャ図
WSLgのアーキテクチャ図[2]

以下のコマンドでDockerコンテナを作成します。ベースイメージはubuntu:22.04とします。

$ docker run -it --name gui \
    --mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix \
    --mount type=bind,source=/mnt/wslg,target=/mnt/wslg \
    --env DISPLAY=${DISPLAY} --env WAYLAND_DISPLAY=${WAYLAND_DISPLAY} \
    --env XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR} \
    ubuntu:22.04

動作確認

X11 の動作確認

コンテナ内
# apt install x11-apps
# xeyes

Wayland の動作確認

コンテナ内
# apt install weston
# weston-simple-egl

以下のように表示されます。(weston-simple-egl は三角形が回転してます)

動作確認

フォント設定

タイトルバーのフォントはコンテナ内から参照されません。
そのため、タイトルバーのみ文字化けが発生することがあります。

タイトルバー文字化け
gnome-terminal
タイトルバーに「あいうえお」と表示されてほしい

フォントは/mnt/wslg/distro配下の/usr/share/fontsフォルダから読み込まれます。[3]
/mnt/wslg/distroはDockerホストの/にリンクされているのでDockerホスト側でフォントをインストールする必要があります。

Dockerホスト側
$ sudo apt install fonts-noto-cjk

フォントを読み込ませるために一度WSLを終了する必要があります。

コマンドプロンプト
> wsl --shutdown

フォント設定後
ホスト側のフォント設定後

脚注
  1. https://github.com/microsoft/wslg/blob/main/samples/container/Containers.md ↩︎

  2. https://github.com/microsoft/wslg#wslg-architecture-overview ↩︎

  3. WSLgのfontconfig ↩︎

Discussion