WSL2+Docker+WSLgでSpyder動かす

# 環境

* Windows11 Pro 23H2
* WSL2
* Ubuntu-22.04
* Docker Desktop 4.36.0
* Docker version 27.3.1, build ce12230
* Spyder IDE 6.0.1
* (Spyder IDEの表示）Python 3.12.7 64-bit | Qt 5.15.2 | PyQt5 5.15.10
Linux 5.15.133.1-microsoft-standard-WSL2 (x86_64)

# 概要

Spyderを利用するAnaconda環境の構築にトライしたらハマったので、まずはminicondaでSpyderだけ動かせるようにした。

# 前段階

WSL2およびDockerのインストールについては省略。

:::note info
Dockerのバージョンには注意！
今回はDocker-CEでなくDocker（商用利用は有料）を使用している。
:::

# 環境変数の変更

## display.sh

```bash
#!/bin/bash

# DISPLAYの値を変更
echo 'export DISPLAY=:0.0' >> ~/.profile

# 再読み込み
source ~/.profile
```

https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html

を参考に設定。WSLgを利用するのでVcXsrvのインストールは不要。

## display.shを実行

```bash
$ source ./display.sh
```

::: note 
普通のシェルスクリプトではなく `source` を使わないと再読み込みが行われない。
:::

</aside>

## 値が変わっていることを確認

```bash
$ echo $DISPLAY
:0.0
```

# コンテナをビルド

## Dockerfile

```docker
# ベースイメージ
FROM continuumio/miniconda3

# アップデート
RUN apt-get update

# 必要なツールのインストール
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y \
    libx11-dev libxext6 libxcb1 libxrender1 libxrandr2 libxi6 \
    libfreetype6 libxinerama1 libxcursor1 \
    libxcb-shm0 libqt5gui5 libqt5widgets5 \
    libxcb-icccm4 libxcb-icccm4-dev \
    libxcb-xinerama0 libxcb-xinerama0-dev \
    libxcb-util1 libxcb-util-dev \
    libxcb-keysyms1 libxcb-keysyms1-dev \
    libxcb-render0 libxcb-render0-dev \
    libxcb-shape0 libxcb-shape0-dev \
    libxcb-shm0 libxcb-shm0-dev \
    libxcb-xfixes0 libxcb-xfixes0-dev \
    libxkbcommon-x11-0 libxkbcommon-x11-dev \
    libpci3 \
    libgl1-mesa-glx libgl1-mesa-dri libglu1-mesa \
    libasound2 \
    x11-apps && \
    apt-get clean

# 環境変数の設定
ENV QT_QPA_PLATFORM=xcb \
    QT_PLUGIN_PATH=/home/user/.local/lib/python3.12/site-packages/PyQt5/Qt5/plugins \
    QT_QPA_PLATFORM_PLUGIN_PATH=/home/user/.local/lib/python3.12/site-packages/PyQt5/Qt5/plugins/platforms

# CondaでSpyderをインストール
RUN conda install -y spyder

```

## docker-compose.yml

```docker
version: "3.9"
services:
  spyder-env:
    build:
      context: .
    image: spyder-env
    container_name: spyder-env-container
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
    stdin_open: true
    tty: true
```

## ビルド実行

```bash
$ docker compose build
```

ライブラリが多いので時間がかかる。

:::note
以下、 `docker compose` とハイフン `-` は無いので注意。
バージョンの問題でハイフン有りの旧式だとコマンドが動作しない。
:::

## コンテナ起動

```bash
$ docker compose up -d
$ docker compose exec spyder-env bash
```

# 動作確認

## DISPLAYの値

```bash
(base) root@4e2213483ac4:/# echo $DISPLAY
:0.0
```

## WSLgが動くか

```bash
(base) root@4e2213483ac4:/# xeyes
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601058/f54652e6-901c-1a65-6f11-ca423f6c86ce.png)


## Spyder起動

```bash
(base) root@4e2213483ac4:/# spyder
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
QGLXContext: Failed to create dummy context
```

![image 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601058/d76cb289-3083-bf46-9c60-ef42db32a6de.png)

# 今後

* Anacondaへの移植
* Spyderで動かしたいツールがあるので準備
* 以下を参考にDocker-CE環境にする
    * [https://qiita.com/s-suefusa/items/cb3c4044da3b3657dbd0](https://qiita.com/s-suefusa/items/cb3c4044da3b3657dbd0)
    * [https://zenn.dev/ndjndj/articles/038e4fd09f6d0d](https://zenn.dev/ndjndj/articles/038e4fd09f6d0d)
    * [https://qiita.com/Jazuma/items/9274d90167a3b61791fa](https://qiita.com/Jazuma/items/9274d90167a3b61791fa)!