🌟

WSL2上のDockerコンテナから`plt.show()`でグラフを表示するための設定

2024/06/24に公開

これはなに

WSL2(Ubuntu)上のDockerコンテナから、matplotlibで作成したグラフをshow()メソッドで表示するための設定のメモ。

前提

Dockerコンテナからplt.show()でグラフを表示しようとすると、下記のようなエラーが発生して、グラフが表示されない。

error
$ /usr/local/bin/python /home/user/workspaces/src/main.py
/home/user/workspaces/src/main.py:9: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
  plt.show()

結論

下記の手順で、WSL2上のDockerコンテナからグラフを表示できるようになる。

  • WSL2上でGUIを表示できるか確認する
  • Dockerコンテナにpython3-tkをインストールする
  • compose.yamlで、ディスプレイへアクセスするための環境変数とボリュームを設定する

筆者の環境

PowerShell
> wsl --version
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3672
Ubuntu
$ docker --version
Docker version 26.1.1, build 4cf5afa
Ubuntu
$ docker compose version
Docker Compose version v2.27.0-desktop.2

WSL2上でGUIを表示できるか確認する

WSLgが使える場合は、WSL2上でGUIを表示できるはずである。GUIが表示できるか確認するために、下記コマンドで適当なGUIアプリを起動してみる。

sudo apt update
sudo apt install -y x11-apps
xeyes

下図のように👀が表示されれば成功である。

xeyes
xeyes

Dockerコンテナからグラフを表示できるように設定する

Dockerfile

Dockerfilepython3-tkをインストールする。

FROM python:3.12-slim

RUN apt-get update && apt-get install -y python3-tk

compose.yaml

compose.yamlで環境変数とボリュームを設定する。これらを設定することで、Dockerコンテナからホストのディスプレイへアクセスできるようになる。

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - /mnt/wslg:/mnt/wslg
      - /tmp/.X11-unix:/tmp/.X11-unix
    environment:
      - DISPLAY=$DISPLAY
      - PULSE_SERVER=$PULSE_SERVER
      - WAYLAND_DISPLAY=$WAYLAND_DISPLAY
      - XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR

main.py

main.pyでグラフを表示する。

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4])
plt.show()

Dockerコンテナ内でグラフが表示されるか確認する

Dockerコンテナを起動し、コンテナ内でmain.pyを実行すると、下図のようにグラフが表示される。

graph
graph

おまけ

確認時の一式をGitHubにアップしている。

参考文献・URL

Discussion