devcontainerでX11 forwarding可能な環境を作る (あとuvとCUDA環境も構築)
devcontainerでCUDA環境とPythonのプロジェクト管理ツールであるuvの環境を構築している際に、何かとGUIアプリを利用する機会がありました。
そこで本記事では、X11 forwardingが可能なDockerfileとdevcontainer.jsonを作成してrerunを起動することと、筆者のメモとして記事を書くことをを目的とします。
なおdockerやdevcontainer、X11転送についての説明は行いません。
結論
以下のように.devcontainerディレクトリ下にdevcontainer.jsonとDockerfileを作成します。ローカル環境でX11転送の設定を先に行ってください。ベースのイメージはnvidia/cudaです。
.devcontainer/
├── devcontainer.json
└── Dockerfile
devcontainer.json
{
"name": "CUDA",
"build": {
"dockerfile": "Dockerfile",
"context": "."
},
"runArgs": ["--gpus", "all", "--shm-size", "16g"],
"mounts": [
"source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached"
],
"remoteEnv": {
"DISPLAY": "${localEnv:DISPLAY}"
},
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": false,
"installOhMyZsh": false,
"installOhMyZshConfig": false,
"upgradePackages": false,
"username": "vscode",
"userUid": "automatic",
"userGid": "automatic"
}
},
"containerUser": "vscode",
"remoteUser": "vscode",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"GitHub.copilot"
]
}
}
}
Dockerfile
FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04
RUN apt-get update && apt-get install -y \
curl \
ca-certificates \
xauth \
x11-apps \
libclang-dev \
libatk-bridge2.0 \
libfontconfig1-dev \
libfreetype6-dev \
libgl1-mesa-dev \
libglib2.0-dev \
libgtk-3-dev \
libssl-dev \
libxcb-render0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxkbcommon-dev \
libxkbcommon-x11-dev \
patchelf \
vulkan-tools \
&& rm -rf /var/lib/apt/lists/*
COPY /uv /uvx /bin/
上記を作成後にVSCodeでdevcontainerをbuildします。Ctrl+Shift+Pコマンドで「Dev Containers: Rebuild and Reopen in Containe」などを実行してください。
正常にdevcontainerが起動できたら以下を実行します。
uv add rerun-sdk
uv run rerun
Rerun viewerが起動すれば成功です。

部分的な解説
Dockerfileについて
まずuvのインストールのためにcurlとca-certificatesが必要です。
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/によって/bin以下にuvとuvxをコピーします。
https://astral.sh/uv/install.sh経由のインストール方法やcurl -LsSf https://astral.sh/uv/install.sh | shなどによるインストールも可能ですが、/root以下にインストールされるためUSERを変える場合にはやや面倒になります。
それ以外のパッケージはX11転送およびRerunのためにインストールしています。問題があればRerunのTroubleshootingを参照してください。
devcontainer.jsonについて
"build"では、前述したDockerfileを指定します。
"runArgs"では、dockerのコマンドライン引数を設定することが可能です。マウントや環境変数の指定は後述の"mounts"やremoteEnvを使いましょう。今回はCUDA container imageを用いるため、"--gpus", "all"と、"--shm-size", "16g"として共有メモリが足りなくなりがちなので大きめに指定してます。
なおNVIDIA Container Toolkitが必要です。
"mounts"では、その名の通りマウントすることが可能です。今回は、X11転送のために/tmp/.X11-unixをマウントします。
"remoteEnv"では、remote containerで環境変数をしていすることが可能です。"mounts"同様にX11転送のためにDISPLAYを設定します。ローカルの環境変数を参照する場合は${localEnv:DISPLAY}としてlocalEnvを使用しましょう。
それ以外は通常のdevcontainerの使用と変わりません。今回はvscodeというユーザー名で、"features"にfeatures/common-utilsで効率的に非rootユーザーの設定を行います。
また、"extensions"で必要なVSCodeのextentionを入れておきましょう。
駆け足ですが以上になります。なにかあればコメントいただけると嬉しいです!
Discussion