🚴
vscodeのdevcontainerについて

2023年12月4日

devcontainerについて

本記事は matsuri technologies 株式会社のカレンダー | Advent Calendar 2023 - Qiitamatsuri technologies 株式会社のカレンダーページです。matsuri technologies 株式会社のカレンダー | Advent Calendar 2023 - Qiita の 5 日目の記事です。

# モチベーション

vscode に devcontainer という機能があるのは皆さんご存知だと思うのですが、 最近、調査している界隈のリポジトリがほぼ(10 個中9個ぐらい)devcontainer を使って使われており、 調査&今まで使ったことなかったので使ってみました。

docker 上で開発を行うことは個人のプロダクト、チーム、仕事など多々あると思うのですが、それの開発環境を(settings,extension を含め)統一できるという部分や doceker の操作に不慣れでも仮想環境を用意して特に docker コマンドを打つことなく local 上で動かしているのと同じように操作できるというのはメリットを感じました。

また、今年の 5 月に vscode から切り離され、別の開発標準の仕様として定めるようになったようです。(つまり独立したプロジェクトになった)

VSCode を超えて汎用的に使えるものだから、Development Containers Specification の検討を始めたって書いてあったわ。 VSCode Remote Container 改め Dev Containersがかなり変わっていて困惑したVSCode Remote Container 改め Dev Containersがかなり変わっていて困惑した

# 作ってみる

extension で devcontainer を入れた後、「ctrl+shift+p」で new dev container を作ることで既存のプロジェクトを docker 上で動かすことができます(スクショ上だと 2 つあって謎ですが・・・)

image

その後ベースのコンテナを選択します。基本的な alphine とかを選んでもいいですし、./devcontainer.json で Dockerfile を指定できるので自分でベースイメージを作って使うこともできます。

コマンドを実行すると./devcontainer.json というのが生えてきます。

# features について

container に機能を追加するものです。devcontainer に機能を追加する方法には主に 3 つあります。

  • dockerfile でベースイメージを拡張してRUN apt install cudaなどをする。
  • postCreateCommand を使う。
  • features を使う。 最初の二つでは確かに便利ですが、例えば cpp などをソースインストールなどをする必要が出てきた場合には何行もスクリプトを書いてめんどくさい時があります。 そういった時に features を使うと 1 行で済むことがあります(features が用意されていれば) https://github.com/devcontainers/features/tree/main/src

また、docker 自体に機能を加えたい時に features は真価を発揮します。 有名なのは dind や dood などをしたい時ですね。 今までだと docker コマンドをこねる必要がありましたが、devcontainer なら features や設定を書いておくだけで済むことが多いです。 dind(docker-in-docker)とdood(docker-outside-of-docker)でコンテナを料理する - Qiita1. はじめにコンテナの中にコンテナを立てたい、コンテナ内からホストマシンのコンテナを操作したい、そんなことを考えた方も多いのではないでしょうか。こうした要求にこたえられる手法がdind (do…dind(docker-in-docker)とdood(docker-outside-of-docker)でコンテナを料理する - Qiita

# customizations.vscode.extensions

これを書いておくとプロジェクトを開いたときに新規に参入した人でも拡張機能を指定できるので、新たに指定する必要がなく、設定なども統一できるので便利です。devcontainer を使うならほぼ必須だと思います。

これも今年の 5 月に仕様変更された影響で書く場所が変わっているようです。

# 使ってみる

既存の./.devcontainer があるリポジトリがあったら vscode で開き、open folder in container などで開く

image

通知部分に container を建てていますみたいなログが出るのでその通知の「show full log」みたいなボタンを押すと、docker build の進捗などが見えます。

プロジェクトによっては結構時間がかかるので気長に待っているといいです(何個も内部で OSS を使うような巨大なプロジェクトだと普通に 2000s ぐらいかかることもあります)

# tips

# wsl on devcontainer で gpu を使いたい

devcontainer.json で下記の gpu パススルー設定をオンにして cuda toolkit などを入れると docker 上でもnvidia-smiなどで gpu が見えるようになります。

"runArgs": ["--gpus", "all"],
"remoteUser": "root"
# Install CUDA(Toolkit)
pushd /workspaces
wget 'https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin'
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget 'https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb'

sudo dpkg -i cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb

rm -f cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb
popd
sudo cp /var/cuda-repo-wsl-ubuntu-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
# Install CUDA END

conda update -y python
conda update -y -n base conda
conda install -y numpy
conda install -y pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

# postCreateCommand が動かない

なぜか実行権限周りでエラーが出ることがあり、最悪 chmod +x .devcontainer/post-create.sh && .devcontainer/post-create.sh

# 感想

便利なんですが結構なマシンスペックが要求されることがわかりました。ただ、最初にいった通り、OS 依存がなくなるのと環境が汚れないのとセットアップなどがかなり楽だったので、おすすめです。 また、同じ界隈で同じ devcontainer が使われているのを見ると、流行ってるんだなぁという気持ちになっていいですね。作られた時期とかによってこのプロジェクトの構成はこのリポジトリから持ってきたじゃんみたいなのも分かるのが面白かったです。