Open6

development containersとは何なのか

sho-hatasho-hata

この記事は

VSCodeには、"devcontainers"というホスト環境と隔離して開発を行うことができる拡張機能が存在する。
https://code.visualstudio.com/docs/devcontainers/containers

ソースコードや拡張機能もまるっとコンテナに入れて、開発に必要な拡張機能やツール、ランタイム・ライブラリをホストと分離できる。

VSCodeのいち拡張機能という認識だったのだが、先日development containersという仕様が存在することを知った

https://containers.dev/

VSCodeの"devcontainers"から派生し、共通化を図ったものなのかもしれない。仕様が存在するいうことは、仕様に沿って実装すれば、おそらくLanguage Server Protocolと同様、さまざまなエディタ・IDEから開発用コンテナを操作することができるのだろうという雑感。

VSCode devcontainersはざっくり「拡張機能をコンテナ内で起動できて便利」という認識にとどまっているため、詳細はよくわかっていない。

目標

  • development containersの概要についてわかること
  • VSCode devcontainersとdevelopment containerの関係性についてわかること
  • development containersの仕様についてわかること
  • Dockerfileで開発用コンテナの定義を書く方法と比べて、development containersを使う方法は何が嬉しいのか
sho-hatasho-hata

devlopment containersとは

https://containers.dev/overview

  • デプロイ前のアプリケーションの開発環境を定義するコンテナ環境を定義するもの
  • 開発に必要なツールを本番イメージに含めたくないときに使う
  • CI文脈でも用いられる。たとえばGitHub Actionではリポジトリの開発コンテナ(https://github.com/devcontainers/ci) を実行できる
  • 開発コンテナで必要な情報はdevcontainers.jsonで定義する
sho-hatasho-hata

VSCode devcontainers拡張機能とdevelopment containersの関係性

  • development containers:仕様。development containersコミュニティが管理している。
  • VSCode devcontainers:development containersを実装したVSCodeの拡張機能。開発コンテナ内でVSCode Server(後述)を起動してコンテナ内で拡張機能が使えるといった機能が存在する。

もともとVSCodeのいち機能だったが、MicrosoftがVSCode以外のケースで開発コンテナを統一的な規格で扱えるように仕様に切り出した。

https://code.visualstudio.com/docs/devcontainers/faq#_can-i-use-dev-containers-outside-of-vs-code

sho-hatasho-hata

development containersの仕様

devcontainers.jsonで指定できるプロパティは以下にまとめられている。
https://containers.dev/implementors/json_reference/

containerEnvといったコンテナの環境変数周りのプロパティなど一通り揃っている。
開発コンテナ文脈固有のプロパティとして、

  • shutdownAction(エディタのウィンドウが閉じた時にコンテナも自動的に停止する)

があったり

  • postCreateCommand(コンテナが作成された後に実行するコマンド)
  • postStartCommand(コンテナが開始するたびに実行するコマンド)

といったコンテナライフサイクルにフックした処理を記述するプロパティがあり、凝った環境も作れる。

ライフサイクルについては、開発コンテナ実行ツール(例:VSCode)のライフサイクルも絡んでくるためタイミングがややこしい。下記の記事が参考になる。
https://qiita.com/1mono2/items/5bbf91f588ab9d5cd444#コンテナーで再度開くの挙動

sho-hatasho-hata

特定ツール固有のプロパティ

https://containers.dev/supporting

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拡張機能を使うことによってコンテナの中で拡張機能を動かして開発することができるので、セキュアに開発環境を用意できる。