Devcontainerは、Dockerでの開発環境構築の面倒な部分をシンプルにするための、VS Codeの強力な機能です。Devcontainerを使うことで、Docker単体では面倒だったことが簡単になったり、より便利な機能を使えるようになったりします。
本記事では、Devcontainerの便利な機能をいくつか紹介します。ホストはLinuxである前提で書きます。
便利機能
GUIのみで操作可能
Devcontainerを使うと、コンテナのビルド・起動・アタッチなどをVSCodeのGUIのみで操作できます。なのでDocker慣れしていない人がいるチーム開発でも、比較的簡単にコンテナ仮想化を導入できます。
CLI派の人のためにCLI版もあります。
簡単セットアップ
新しい言語を試したりする際に、コンテナ内に開発環境を用意することがあるかと思います。Devcontainerがない場合はDockerfileに言語のインストール手順を書きますが、Devcontainerを使えば、より簡単に言語を動かす環境を用意できます。
やり方
例として、Python3を動かすための開発環境を用意してみます。
まずは開発用のディレクトリを用意して開きます。
つぎにCtrl+Shift+P
でコマンドパレットを呼び出し、新しい開発コンテナー(New Dev Container)
を選択します。
言語の選択画面になるのでPython 3
を選択。
これでしばらく待つと、Python3をインストールしたコンテナが作成されます。
このように、ちょっと言語を動かすくらいなら簡単に環境を用意できます。ただ、ツール構成が複雑だったりしてカスタマイズをしたい場合はDockerfileを書く必要があります。
Gitの設定
コンテナ内でGitを使用したい場合、Gitのインストールに加えて、.gitconfig
のバインドマウントが必要です。しかしDevcontainerであれば.gitconfig
を自動でコンテナ内と共有してくれるので、コンテナの外と同じ感覚でGitを扱うことができます。
The extension will automatically copy your local .gitconfig file into the container on startup so you should not need to do this in the container itself.
GUIの設定
コンテナ内でGUIを使うためには普通、
-
DISPLAY
環境変数の設定 -
/tmp/.X11-unix
ソケットの共有
が必要です。しかしDevcontainerではその辺を自動でやってくれます。
たまにDISPLAY環境変数の値が変になってVSCodeを再起動しないと治らないバグがあります。自分の環境だけかもしれませんが...
UIDの設定
Dockerでバインドマウントをすると、コンテナ外とコンテナ内でUIDが一致しなくなります。すると、バインドマウントしたファイルのownerがコンテナの内と外で一致せず、ファイルの実行等をできなくなる問題があります。
しかしDevcontainerを使えば、devcontainer.jsonに"updateRemoteUserUID": true
を加えるだけでその問題を回避できます。
On Linux, if you are referencing a Dockerfile, image, or Docker Compose in devcontainer.json, this will also automatically update the container user's UID/GID to match your local user to avoid the bind mount permissions problem that exists in this environment (unless you set "updateRemoteUserUID": false).
拡張機能やsetting.jsonの設定
チーム開発のとき、便利な拡張機能(言語サポートなど)や設定(自動セーブなど)はチーム全体で共有したいものです。Devcontinerの設定ファイルであるdevcontaner.json
にはextensions
やsettings
の項目があり、コンテナ内で有効になる拡張機能や設定項目を記述できます。つまり、チーム内で共有したい拡張機能や設定をdevcontaner.json
に記述してリモートリポジトリに上げておけば、その内容を反映したコンテナが作成できます。
具体的な書き方はリンク先に預けます。
バッジ・URLで環境を共有
OSSの軽いIssueを解決するときなどは、とにかくサクッと開発して動かせる環境があればコントリビュートしやすいです。Devcontainerでは、そういった短期的な開発・動作確認のために開発環境をバッジやURLにして共有することができます。
試しに、Dockerの入っている環境で以下のバッジかURLをクリックしてみてください。Javaの入ったコンテナが立ち上がります。
実際にコンテナ内に入ったあとがこんな感じです。リポジトリのCloneやJavaのインストールが済んでいるうえに、ビルドまでできます。
WSL2を使用している人は、WSL2環境ではなくWindows側にDockerをインストールする必要があるようです。
OSSのREADMEにバッジを貼っておくと開発者がスムーズに開発を開始できてよさそうです。
まとめ
Devcontainerの以下の機能について説明しました。個人的には特に、GUIのみでの操作や、Git・GUI・UIDの設定の自動化機能がDockerへの不満に対する解決策になっていて嬉しい点です。
- GUIのみで操作可能
- 簡単セットアップ
- Gitの設定
- GUIの設定
- UIDの設定
- 拡張機能やsetting.jsonの設定
- バッジ・URLで共有