WSL2上のコンテナ環境で、WSLgを使う方法

  • By melted-soy-source
  • 2
  • 5 min read
  • Tags: 
  • tech
  • tips

 Windowsで開発をする人であれば、結構な人がお世話になっているのではないか、WSL。さらにWSLgというGUI表示ツールを使うことで、WSL内のコンテナ内でGUIを使える。

    graph TD

Windows --> WSL --> Container

 この環境でGUIを使いたい。その方法を確立した......というか発見したので、メモメモ。

結論

 Containerizing GUI applications with WSLgを見ろー!

 こちら、Microsoftの公式のWSLgのサンプル。これにしたがってコンテナを作成すればok。
 とはいえ元記事が英語なので、内容をかいつまんで非公式なんちゃって和訳をする。

日本語解説(非公式)

各種GUIサーバに接続

 コンテナ上で起動しているGUIを、Windows上で表示させるには、WSLgが提供しているGUI系のサーバに接続する必要がある。
 それには

  1. 適切なディレクトリのマウント
  2. 環境変数の設定

が必要。具体的にはさっきのWSLgのサンプル内のContainerized GUI applications connecting to X11, Wayland or Pulse serverの章をよく見る。
 まずマウント対象のファイルは、

サーバマウントポイント
X11/tmp/.X11-unix
Wayland/mnt/wslg
PulseAudio/mnt/wslg

という表がある。そして、環境変数は

サーバ環境変数
X11DISPLAY
WaylandWAYLAND_DISPLAY && XDG_RUNTIME_DIR
PulseAudioPULSE_SERVER

となっている。どれもコンテナ作成時に、WSL環境からコンテナに手渡ししてあげる必要がある。わかってしまえば簡単。これでX ServerWaylandで動いているGUIに関しては、基本的には実行できるぜ。やったね。
 設定方法やらなんやらは、Containerizing GUI applications with WSLgに詳しく書いてあるからそれをみよう。あとはdockerやらpodmanやらの使い方だから。本当はdocker-compose.yamlとかにしたほうがいいんだろう。けれど私はpodman使っていて、composeの書き方もよくわからんので、フツーにCLIで叩いている。

# [Containerizing GUI applications with WSLg]から引用して、podman用に改変
podman create -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /mnt/wslg:/mnt/wslg \
    -e DISPLAY=$DISPLAY -e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
    -e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR -e PULSE_SERVER=$PULSE_SERVER -it {Container image}

こんなイメージ。あとはコンテナ必要なポートとかも、追加で設定すればok

TauriのGUIアプリをWSLg越しに起動

こんな風にTauriの画面を召喚したりできる。

所感

 WSLこれは便利。WSLgのおかげでわりとGUIもいけるから、重宝している。ただこのGUI表示は、やや内容がこちゃついているから毎回忘れるので、今回の記事は備忘録も兼ねている。
 一度、大学の授業でROSというロボット開発系の環境を構築したことがあったのだが、そのときにメチャクチャGUI周り苦戦した。
 もっとWSLとかの中身を、知っていればいいんだろうけどね。そうすれば毎回公式を思い出す方式じゃなくて、公式を導出する方式にできるから。
 ちなみにそういう「WSLの中身」が気になる人は、ここが変だよ「WSL2」 自作ディストロ開発で発見した知られざる“バグ”と“事実”が面白いかも。

参考