🚀 VS Code で を入手しましょう!

カスタム Dev Container Features

2022年9月15日 Brigit Murtaugh 著, @BrigitMurtaugh

開発環境をセットアップする際に、誰もが「ああ、もう一つだけ必要なものがある!」と思う瞬間があったはずです。その「もの」とは、プロジェクトで作業するためにもう一つ(あるいはもう少し多いかもしれません😊)の言語やツールセットのことです。

開発コンテナは、環境設定を簡素化するのに最適な方法です。プロジェクトに必要なツールが揃った完全なコーディング環境を提供します。開発コンテナは、イメージ、Dockerfile、または Docker Compose ファイルと devcontainer.json を使用して構成されます。devcontainer.json は、コンテナを開発に特化したコンテンツと設定で拡張するために使用されるメタデータ形式です。

Dev container を作成する際、「ああ、もう一つだけ必要なものがある!」という反応を何度も繰り返すかもしれません。たとえば、Dockerfile で Node.js イメージを使用しており、Git を追加する必要があるだけかもしれません。あるいは、Dev container 内から Docker や Kubernetes を操作するなど、より複雑なものを追加する必要があるかもしれません。Dev container は、コードにアクセスするすべての人が、追加したすべてのツールで同じ一貫したエクスペリエンスを得られるため優れています。しかし、それらを追加する最良の方法は何でしょうか?

Dev container にその追加ツールをインストールする簡単な方法があり、ツールの名前とバージョンを記述するだけで済むとしたらどうでしょうか? または、ツールユーザーまたは作成者として、他の人がツールをインストールする簡単な方法を作成できるとしたらどうでしょうか? 手動スクリプトを共有することは再利用に役立ちますが、参照する際に、Go、Rust、または C++ デバッグの ptrace サポートの有効化、コンテナ起動時に起動する特定のエントリポイントの追加、または適切な VS Code 拡張機能が含まれていることを確認するなど、コンテナまたはツール設定の参照を忘れる可能性があります。

フィーチャーズ

Dev container のフィーチャーズは、Dev container 内に必要なツールをスムーズに入手するのに役立つことを共有できてうれしいです!

フィーチャーズは、Dev container で新しい開発機能を有効にするように設計された、インストールコード、コンテナ構成、および/または設定と拡張機能の自己完結型ユニットです。これらは、幅広いベースコンテナイメージで動作するように構築できます。オープンな Dev container 仕様に関する作業の一環として、事前作成されたフィーチャーズを入手できる場所と、独自のフィーチャーズをオーサリングおよび配布する方法について、いくつかの改善を行いました。

新機能と、VS Code Dev Containers 拡張機能や GitHub Codespaces など、Dev container をサポートするツールまたはサービスからフィーチャーズを使い始める方法を見ていきましょう!

Dev container にフィーチャーズを追加する

Dev Container Features は、Dev container メタデータをいくつかのインストール手順に関連付けるための迅速な方法を提供します。簡単な参照を通じて、Dev container に追加できます。

これらのフィーチャーズは、OCI Artifacts として、サポートされている任意のコンテナレジストリに保存できるようになりました。つまり、コンテナイメージを参照するために使用するのと同じタイプの識別子を使用して参照できます。以前は vscode-dev-containers リポジトリにあった初期のフィーチャーズの一部を、新しい devcontainers/features リポジトリに移動しました。これらのフィーチャーズは、この新しいアプローチを使用して公開されています。

devcontainers/features リポジトリからさまざまなフィーチャーズを参照するのは、devcontainer.jsonfeatures プロパティを追加するのと同じくらい簡単です。各フィーチャーズには、フィーチャーズの参照方法と、フィーチャーズで利用可能なオプションを示す README.md があります。

以下の例では、go および docker-in-docker フィーチャーズをインストールします

"name": "my-project-devcontainer",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
    "ghcr.io/devcontainers/features/go:1": {
        "version": "1.18"
    },
    "ghcr.io/devcontainers/features/docker-in-docker:1": {
        "version": "latest",
        "moby": true
    }
}

公式および公開されているコントリビューションフィーチャーズは、仕様サイトで確認することもできます。任意のフィーチャーズは devcontainer.json を編集することで追加でき、公開されているフィーチャーズは、既存の Dev container 構成エクスペリエンス(VS Code Dev Containers 拡張機能で利用可能なものなど)を通じて追加できます。

Specification site list of available Features

dev container CLI、GitHub Action、または Azure DevOps タスクを使用して、お気に入りの CI システムからフィーチャーズを含む Dev container を使用することもできます。devcontainers/ci リポジトリで利用可能な GitHub Action と Azure DevOps タスクがあります。Dev container CLI、GitHub Action、または Azure DevOps タスクは、起動時間を短縮するために、フィーチャーズのコンテンツを含む 事前ビルドイメージにも使用できます。

公開されているフィーチャーズを使用するだけでなく、独自のプライベートまたはパブリックフィーチャーズを作成して共有したい場合は、読み続けてください!

オーサリング

独自のフィーチャーズの作成を開始するのに最適な場所は、新しい Features template リポジトリです。特定のフィーチャーズのコンテンツに適したテンプレートが含まれているだけでなく、GitHub Container Registry (GHCR) をアカウントで使用して、できるだけ早く起動して実行できるように、GitHub Actions ワークフローも含まれています。公開については後ほど詳しく説明します。

フィーチャーズのソースコードには、インストールスクリプト (install.sh) と構成ファイル (devcontainer-feature.json) の 2 つのコンポーネントがあります。

+-- feature
|    +-- devcontainer-feature.json
|    +-- install.sh
|    +-- (other files)

install.sh: インストールエントリポイントスクリプト – これは概念的にはイメージの Dockerfile のレイヤーとして追加され、ビルド時に実行されます。このエントリポイントスクリプトは、言語 (Ruby など) やツール (GitHub CLI) などのツールをインストールできます。

devcontainer-feature.json: これには、フィーチャーズに関するメタデータ、インストール中にフィーチャーズのインストールスクリプトに渡すことができるオプションのセット、および最終的な Dev container にマージされる devcontainer.json の「断片」が含まれています。たとえば、フィーチャーズのいずれかが構成で "privileged": true を示している場合、Dev container 全体が --privileged フラグを付けて起動されます。

フィーチャーズはさまざまな言語で作成でき、最も簡単なのはシェルスクリプトです。フィーチャーズが別の言語で作成されている場合は、ユーザーが情報に基づいた選択を行えるように、その情報がメタデータに含める必要があります。

注: install.sh は任意の言語でフィーチャーズを実行しますが、Dev container に存在しないインタープリター言語でフィーチャーズを作成した場合、コードは実行に失敗します。install.sh の一部として必要な言語を必ず取得してください。

公開するフィーチャーズは、フィーチャーズに加えて依存関係をチェックしてインストールするようにしてください。

さらに、公開されているフィーチャーズは、arm64 マシンと x86_64 マシンの両方から使用される可能性が非常に高いため、可能な場合はこれに対応するようにしてください。

仕様devcontainer-feature.json プロパティと、devcontainers/features リポジトリの公開例を確認できます。

フィーチャーズの作成方法を見てきたので、他のユーザーに配布するにはどうすればよいでしょうか?

配布

フィーチャーズは tarball として配布されます。tarball には、devcontainer-feature.jsoninstall.sh、およびディレクトリ内のその他のファイルを含む、フィーチャーズサブディレクトリの内容全体が含まれています。

Open Container Initiative (OCI) は、コンテナとコンテナリソースの業界標準を定義しています。フィーチャーズを OCI Artifacts として扱い、OCI レジストリの概念を使用してフィーチャーズを配布します。

上記のFeatures template リポジトリには、公開プロセスを自動化する GitHub Actions ワークフローが含まれています。フィーチャーズを tarball にパッケージ化し、アセットを OCI アーティファクトとして GHCR に公開します。テンプレートリポジトリの Actions タブの左側で選択して、release.yaml ワークフローをトリガーします。GitHub Action は、フィーチャーズを <owner>/<repo> 名前空間の下の GHCR に公開します。フィーチャーズが再公開されるのは、その devcontainer-feature.json の version プロパティが更新された場合のみです。

注: GHCR の手動手順の 1 つは、OCI パッケージを「公開」としてマークすることです。これは、フィーチャーズごとに 1 回だけ行う必要があります。プライベートフィーチャーズはこの手順を必要とせず、レジストリの認証情報を使用して Docker CLI にログインしている限りアクセスできます。

コミュニティとフィーチャーズを共有する

VS Code Dev Containers または GitHub Codespaces UI での開発コンテナの作成にコントリビューションを表示したい場合は、次の手順を実行できます

マージされると、変更が containers.dev/collections に表示されます。

フィーチャーズのインストール順序

フィーチャーズが別のフィーチャーズの後にのみインストールする必要がある場合はどうすればよいですか? フィーチャーズの作成者は、フィーチャーズが他のフィーチャーズの前または後にインストールする必要がある場合があります。devcontainer-feature.json では、installsAfter プロパティを使用して、その前に実行する必要があるフィーチャーズをリストできます。

エンドユーザーとして、devcontainer.jsonoverrideFeatureInstallOrder プロパティを使用して、実行順序をさらに制御できます。この配列内のフィーチャーズ ID は、他のすべてのフィーチャーズよりも前に、指定された順序でインストールされます。例として

"features": {
      "ghcr.io/devcontainers/features/java:1",
      "ghcr.io/devcontainers/features/node:1",
  },
  "overrideFeatureInstallOrder": [
    "ghcr.io/devcontainers/features/node"
  ]

デフォルトでは、フィーチャーズは、実装ツールによって最適と判断された順序でベースイメージの上にインストールされます。

フィーチャーズの devcontainer-feature.json、またはユーザーの devcontainer.json で次のプロパティのいずれかが指定されている場合、これらのプロパティによって示される順序が尊重されます (優先順位は低くなります)。

  1. ユーザーの devcontainer.jsonoverrideFeatureInstallOrder プロパティ。ユーザーはフィーチャーズの実行順序を制御できます。
  2. フィーチャーズの devcontainer-feature.json の一部として定義された installsAfter プロパティ。

フィーチャーズの実行とインストール順序の詳細については、仕様を参照してください。

他に新機能はありますか?

新しい Features リポジトリとともに、最近、以前は vscode-dev-containers リポジトリにあった特定の一連のイメージをホストする新しい devcontainers/images リポジトリをオープンソース化しました。

Dev container テンプレート (以前は vscode-dev-containers で「定義」と呼んでいたもの) のコミュニティ配布計画を策定しています。これはフィーチャーズと同様になると予想しています。新しいフィーチャーズとイメージリポジトリを発表したときと同様に、vscode-dev-containers リポジトリで最新情報をお知らせします。

どうすればもっと学べますか?

この記事では、フィーチャーズでできることの表面をなぞったにすぎませんが、ぜひお試しください!

上記のコンテンツ全体にリンクされているように、フィーチャーズの内容と配布方法の詳細については、Dev container 仕様のフィーチャーズフィーチャーズの配布ページをご覧ください。

フィーチャーズの使用、作成、公開に関するフィードバックをお待ちしています。フィーチャーズに関する問題提案フィーチャーズの配布に関する問題提案でお知らせください。

仕様全体に関与したり、別のツールを接続して仕様を活用したりすることに関心がある場合は、Dev container 仕様および CLI リポジトリを確認してください。

Dev container の作成とコーディングをお楽しみください!

Brigit Murtaugh, @BrigitMurtaugh