🌟
WSL2上のDockerコンテナから`plt.show()`でグラフを表示するための設定
これはなに
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
で、ディスプレイへアクセスするための環境変数とボリュームを設定する
筆者の環境
- Windows 11 Pro
- WSL2(Ubuntu 22.04)
- WSL2はWSLgが使えるバージョンであること
- Docker
- Docker Compose
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
Dockerコンテナからグラフを表示できるように設定する
Dockerfile
Dockerfile
でpython3-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
おまけ
確認時の一式をGitHubにアップしている。
Discussion