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