に参加して、VS Code の AI 支援開発について学びましょう。

カスタムDev Container Features

2022年9月15日 ブリジット・マータフ著、@BrigitMurtaugh

開発環境を設定しているときに、誰もが「あとひとつだけ必要だ!」と感じる瞬間があったはずです。その「ひとつ」とは、プロジェクトで作業するために必要な言語やツールセット(あるいはいくつか追加で😊)のことです。

開発コンテナは、環境設定を簡素化する優れた方法です。プロジェクトに必要なツールを備えた完全なコーディング環境を提供します。これらは、イメージ、Dockerfile、またはDocker Composeファイルとdevcontainer.json(開発固有のコンテンツと設定でコンテナを強化するために使用されるメタデータ形式)を使用して構成されます。

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

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

機能

開発コンテナのFeaturesが、開発コンテナに必要なツールをスムーズに入手するのに役立つことをお知らせします!

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

何が新しくなったのか、そして、開発コンテナをサポートする任意のツールまたはサービス(VS Code Dev Containers拡張機能やGitHub Codespacesなど)からFeaturesを開始する方法を見てみましょう!

開発コンテナにFeaturesを追加する

Dev Container Featuresは、開発コンテナのメタデータといくつかのインストール手順を関連付ける簡単な方法を提供します。これらを簡単な参照で開発コンテナに追加できます。

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

devcontainers/featuresリポジトリから異なるFeaturesを参照するには、devcontainer.jsonfeaturesプロパティを追加するだけです。各Featureには、Featureの参照方法と利用可能なオプションを示すREADME.mdがあります。

以下の例は、goおよびdocker-in-docker Featuresをインストールします。

"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
    }
}

仕様サイトで公式および一般から貢献されたFeaturesを探索することもできます。どのFeatureもdevcontainer.jsonを編集して追加でき、公開されているFeatureは既存の開発コンテナ構成エクスペリエンス(VS CodeのDev Containers拡張機能で利用可能など)を通じて追加できます。

Specification site list of available Features

dev container CLI、GitHub Actions、またはAzure DevOpsタスクを使用して、お気に入りのCIシステムからFeaturesを含む開発コンテナを使用することもできます。devcontainers/ciリポジトリには、GitHub ActionsとAzure DevOpsタスクが用意されています。dev container CLI、GitHub Actions、またはAzure DevOpsタスクは、Featureコンテンツを含むイメージを事前にビルドして起動時間を短縮するためにも使用できます。

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

オーサリング

独自のFeaturesを作成するための良い出発点は、新しいFeaturesテンプレートリポジトリです。特定のFeatureの内容の良いテンプレートが含まれているだけでなく、このテンプレートには、アカウントのGitHub Container Registry(GHCR)を使用して、それらを迅速に公開するためのGitHub Actionsワークフローも含まれており、できるだけ早く立ち上げられるようにします。公開については後で詳しく説明します。

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

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

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

devcontainer-feature.json:これには、Featureに関するメタデータ、インストール時にFeatureのインストールスクリプトに渡すことができるオプションのセット、および最終的な開発コンテナにマージされるdevcontainer.jsonの「部分」が含まれます。たとえば、Featureが構成で"privileged": trueを示す場合、開発コンテナ全体が--privilegedフラグで起動されます。

Featuresはさまざまな言語で作成できますが、最も簡単なのはシェルスクリプトです。Featureが異なる言語で作成されている場合、ユーザーがそれについて情報に基づいた選択をできるように、それに関する情報がメタデータに含まれるべきです。

注: install.shはどの言語のFeatureでも実行しますが、開発コンテナに存在しないインタープリタ言語でFeatureを作成した場合、コードは実行に失敗します。install.shの一部として必要な言語を必ず取得してください。

公開するFeaturesが、Featureに加えて依存関係をチェックしてインストールすることを確認する必要があります。

さらに、公開Featuresはarm64またはx86_64マシンから使用される可能性が高いので、可能な場合はこれに適応するようにしてください。

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

Featuresの作成方法がわかったところで、どうやって他の人に配布すればよいでしょうか?

配布

Featuresはtarballとして配布されます。tarballには、devcontainer-feature.jsoninstall.sh、およびディレクトリ内のその他のファイルを含む、Featureサブディレクトリのすべてのコンテンツが含まれます。

Open Container Initiative(OCI)は、コンテナおよびコンテナリソースの業界標準を定義しています。私たちはFeaturesをOCI Artifactsとして扱い、Featuresを配布するためにOCI Registryの概念を使用します。

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

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

Featuresをコミュニティと共有する

あなたの貢献を、VS CodeのDev ContainersまたはGitHub CodespacesのUIで開発コンテナ作成時に表示したい場合は、以下の手順を実行してください。

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

Featureのインストール順序

あるFeatureが別のFeatureの後にのみインストールされるべき場合はどうすればよいでしょうか?Featureの作成者として、あなたのFeatureが他のFeaturesの前または後にインストールされるべきだとわかるかもしれません。devcontainer-feature.jsonでは、installsAfterプロパティを使用して、そのFeatureの前に実行されるべきFeaturesをリストできます。

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

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

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

以下のプロパティのいずれかがFeatureのdevcontainer-feature.jsonまたはユーザーのdevcontainer.jsonで提供されている場合、これらのプロパティによって示される順序が(優先度の低い順に)尊重されます。

  1. ユーザーのdevcontainer.jsonにあるoverrideFeatureInstallOrderプロパティ。ユーザーがFeaturesの実行順序を制御できるようにします。
  2. Featureのdevcontainer-feature.jsonの一部として定義されているinstallsAfterプロパティ。

Featureの実行とインストール順序について詳しくは、仕様をご覧ください。

他に何が新しくなったか?

新しいFeaturesリポジトリと並行して、最近、新しいdevcontainers/imagesリポジトリをオープンソース化しました。ここでは、以前vscode-dev-containersリポジトリにあった特定のイメージセットをホストしています。

現在、開発コンテナテンプレート(vscode-dev-containersで「定義」と呼んでいるもの)のコミュニティ配布計画を策定しており、Featuresと同様になると予想しています。新しいFeaturesとイメージのリポジトリの発表時に行ったように、vscode-dev-containersリポジトリで必ず更新を投稿します。

さらに詳しく学ぶには?

この投稿では、Featuresでできることのほんの一部に触れただけですが、皆さんに試していただけることを楽しみにしています!

上記コンテンツ全体でリンクされているように、Featuresの内容と配布方法についてさらに詳しく学ぶための最適な場所は、開発コンテナ仕様のFeaturesFeatures distributionのページです。

Featuresの使用、作成、公開に関する皆様からのフィードバックを楽しみにしています。皆様のFeaturesFeatures distributionの課題提案でのご感想をお待ちしております。

仕様全体に関与したり、他のツールを仕様に活用したりすることに興味がある場合は、開発コンテナのspecCLIリポジトリをチェックしてください。

Dev Containerの作成とコーディングを楽しんでください!

Brigit Murtaugh、@BrigitMurtaugh

© . This site is unofficial and not affiliated with Microsoft.