development containersとは何なのか
この記事は
VSCodeには、"devcontainers"というホスト環境と隔離して開発を行うことができる拡張機能が存在する。
ソースコードや拡張機能もまるっとコンテナに入れて、開発に必要な拡張機能やツール、ランタイム・ライブラリをホストと分離できる。
VSCodeのいち拡張機能という認識だったのだが、先日development containersという仕様が存在することを知った。
VSCodeの"devcontainers"から派生し、共通化を図ったものなのかもしれない。仕様が存在するいうことは、仕様に沿って実装すれば、おそらくLanguage Server Protocolと同様、さまざまなエディタ・IDEから開発用コンテナを操作することができるのだろうという雑感。
VSCode devcontainersはざっくり「拡張機能をコンテナ内で起動できて便利」という認識にとどまっているため、詳細はよくわかっていない。
目標
- development containersの概要についてわかること
- VSCode devcontainersとdevelopment containerの関係性についてわかること
- development containersの仕様についてわかること
- Dockerfileで開発用コンテナの定義を書く方法と比べて、development containersを使う方法は何が嬉しいのか
devlopment containersとは
- デプロイ前のアプリケーションの開発環境を定義するコンテナ環境を定義するもの
- 開発に必要なツールを本番イメージに含めたくないときに使う
- CI文脈でも用いられる。たとえばGitHub Actionではリポジトリの開発コンテナ(https://github.com/devcontainers/ci) を実行できる
- 開発コンテナで必要な情報は
devcontainers.json
で定義する
VSCode devcontainers拡張機能とdevelopment containersの関係性
- development containers:仕様。development containersコミュニティが管理している。
- VSCode devcontainers:development containersを実装したVSCodeの拡張機能。開発コンテナ内でVSCode Server(後述)を起動してコンテナ内で拡張機能が使えるといった機能が存在する。
もともとVSCodeのいち機能だったが、MicrosoftがVSCode以外のケースで開発コンテナを統一的な規格で扱えるように仕様に切り出した。
development containersの仕様
devcontainers.json
で指定できるプロパティは以下にまとめられている。
containerEnv
といったコンテナの環境変数周りのプロパティなど一通り揃っている。
開発コンテナ文脈固有のプロパティとして、
-
shutdownAction
(エディタのウィンドウが閉じた時にコンテナも自動的に停止する)
があったり
-
postCreateCommand
(コンテナが作成された後に実行するコマンド) -
postStartCommand
(コンテナが開始するたびに実行するコマンド)
といったコンテナライフサイクルにフックした処理を記述するプロパティがあり、凝った環境も作れる。
ライフサイクルについては、開発コンテナ実行ツール(例:VSCode)のライフサイクルも絡んでくるためタイミングがややこしい。下記の記事が参考になる。
特定ツール固有のプロパティ
devcontainers.json
は特定ツール固有のプロパティで拡張できる。例えば、extensions
で開発で使用する拡張機能をレコメンドしたりなど。
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
"extensions": ["DavidAnson.vscode-markdownlint"],
}
}
devcontainerを使うモチベ
Dockerfileで開発用コンテナの定義を書く方法と比べて、development containersを使う方法は何が嬉しいのか。
自分の所感
- ランタイムやコマンドラインツールの他に、拡張機能もセットで用意することができる。
- DockerFileを使う方法では、READMEに書くことしかできない。
-
devcontainer templateとして、開発コンテナをパッケージ化して配布することができる。
- プロジェクトを跨いで開発コンテナの共通化ができるため、プロジェクトごとに開発ツールの設定ファイルの乱立やバージョン差異を最小限にとどめることができる
- VSCodeを使用していれば、devcontainers拡張機能を使うことによってコンテナの中で拡張機能を動かして開発することができるので、セキュアに開発環境を用意できる。
- 例えば、悪意のあるVSCode拡張機能がディレクトリトラバーサルやスクリプトインジェクションを行ったとしても、ホスト側には影響しない
- ※要検証。参考:https://github.com/microsoft/vscode/issues/52116#issuecomment-2028487842)
参考記事