VS Codeのエージェントモードを拡張するには、を試してください!

VS Code でコンテナーを検査する

2019年10月31日 Bowden Kelly 著、@bowdenk7

コンテナー化されたアプリケーションを開発する際、ビルド時および実行時の問題をデバッグするために、実行中のコンテナーに docker exec --it {containerID} /bin/sh を使用してシェルをアタッチすることはよく行われます。

Running docker exec command

この手法を使うと、コマンドライン経由でコンテナー環境を検査できますが、問題を診断するための豊富なツールセットは提供されません。

この記事では、Visual Studio Code をコンテナーにアタッチして、デバッグを含む VS Code の全機能を使用してコンテナーを検査し、何が問題なのかを特定して修正する方法を見ていきます。

今年5月にリリースされた Dev Containers 拡張機能を使用すると、ローカルの VS Code をコンテナーホストに接続しながら、すべての個人設定、テーマ、キーバインディングを維持できます。

前提条件

このブログ記事では、Docker DesktopVisual Studio Code がインストールされていることを前提としています。また、Dev Containers 拡張機能も必要です。Dev Containers 拡張機能をインストールするには、拡張機能ビュー (⇧⌘X (Windows, Linux Ctrl+Shift+X)) を開き、「Dev Containers」を検索し、インストールを選択し、指示された場合は VS Code を再起動してください。

アプリケーション

まず必要なのは、コンテナー内で実行できるアプリケーションです。すでにお持ちであれば、それで大丈夫です!この手順はスキップできます。そうでなければ、このシンプルな Node.js Express アプリケーションをクローンしてください。

注意: Node.js をローカルにインストールする必要はありません。このアプリケーションはコンテナー内で実行します!

git clone https://github.com/microsoft/vscode-express-sample.git

このアプリケーションには、Node 10 イメージをベースにしたシンプルな Dockerfile と、イメージを実行し、適切なポートを公開し、ローカルファイルシステムをマッピングするために使用する docker-compose.yml ファイルが含まれています。ローカルで実行する場合と同じようにアプリをデバッグできるように、Node を –inspect フラグ付きで実行しています。実際のアプリケーションでは、本番デプロイ用に別の Docker Compose ファイルを用意したいと考えるでしょう。

注意: Docker Compose ファイルは必須ではありません。単一の Dockerfile で作成されたコンテナーにもアタッチできます。

ビルドと実行

アプリケーションをビルドして実行するには、まず依存関係をインストールし、次にターミナル/コマンドプロンプトから docker-compose up を実行します。これにより、Node ベースイメージがダウンロードされ、依存関係がコピーされ、コンテナーが起動します。

docker-compose up

すべてうまくいけば、次のような出力が表示されるはずです。

docker-compose up output

そして、https://:3000 にアクセスすると、次の画面が表示されるはずです。

Welcome to Express web page

コンテナーにアタッチする

これで、Dev Containers 拡張機能を使用して、実行中のコンテナーにアタッチし、環境を検査し、アプリケーションをデバッグできます。

アクティビティバーの「リモートエクスプローラー」を選択すると、Other Containers セクションにアタッチできる実行中のコンテナーのリストが表示されます。先ほど起動したコンテナー(名前は 'express_server_1')を見つけて、Connect to Container ボタンを使用してアタッチします。そのコンテナーがリモートエクスプローラーのAttached Containers セクションに表示されるはずです。

Attached Containers in the Remote Explorer

これにより、右下に次の通知が表示された新しい VS Code ウィンドウ(インスタンス)が起動します。

Installing Dev Container notification

この間、VS Code は、アプリケーションが実行されているコンテナー内に VS Code Server のインスタンスをインストールしています。このインストール手順の詳細と進捗を確認するには、通知に表示されている詳細リンクを選択できます。VS Code サーバーがインストールされると、ローカルの VS Code クライアントがリモート VS Code サーバーに接続します。これにより、すべての設定、テーマ、キーバインディングが適用されたローカルの VS Code インスタンスが、アプリケーションと共にコンテナー内で実行されている「バックエンド」に接続されます。

Dev Containers architecture diagram

接続が完了すると、左下に緑色のインジケーターが表示された新しい VS Code ウィンドウが開きます。これは、この VS Code インスタンスがリモートコンテキストで実行されていることを示しています。インジケーターをクリックすると、現在のリモートコンテキストに関連するコマンドのドロップダウンが表示されます。

Remote context shown in the Status bar

さっそくフォルダーを開くボタンを選択し、/usr/src/app に移動してアプリケーションを開きましょう。「フォルダーを開く」ダイアログには、実行中のコンテナー内のファイルシステムが表示され、ローカルファイルシステムではないことに注意してください。

Open Folder dialog show container file system

ソースフォルダーを開くと、エディターに express-server.json というファイル名のファイルが開かれていることに気づくでしょう。この名前は、アタッチしたコンテナーイメージ名に由来しています。この例では、docker-compose は、フォルダー名 expressdocker-compose.yml ファイルで定義されているサービス名 server から導出されたイメージ名「express_server」を作成します。このファイルは、イメージに関連付けられた設定ファイルであり、このイメージに基づくコンテナーにアタッチする際に設定を記憶します。自動保存がオンになっていない場合は、このファイルを保存する必要があります。今後、このイメージにアタッチすると、VS Code はこのソースフォルダーを再度開きます。

注意: 現在の開発コンテナーのこのファイルは、コマンドパレット (⇧⌘P (Windows, Linux Ctrl+Shift+P)) からコンテナー設定ファイルを開くコマンドを実行して表示できます。

express-server.json file contents

この時点では、VS Code は通常のローカル VS Code ウィンドウと同じように見えます。

VS Code running in a container

通常のローカル VS Code コンテキストで行えることは、すべて行うことができます。

例えば、app.js を開きます。8行目を右クリックし、すべての参照を検索を実行して usersRouter のすべての使用箇所を見つけます。docker-compose ファイルを使用してローカルファイルシステムをコンテナーにマウントしているため、すべての編集はローカルディスクに永続化されます。

コンテナー内でデバッグする

開発コンテナーがローカル環境とどれほど似ているかをさらに示すために、デバッガーをアタッチしてみましょう。Node アプリケーションを docker-compose.yaml–inspect パラメーター付きで起動したので、そのプロセスにデバッガーをアタッチするだけです。

コマンドパレット (⇧⌘P (Windows, Linux Ctrl+Shift+P)) で、「デバッグ: Nodeプロセスにアタッチ」を検索して選択します。コンテナー内で複数の Node プロセスが実行されている可能性があります。私たちのアプリケーションを実行しているプロセスを選択したいので、bin/www と表示されているものを選択します。

Node process picker list

次に、index.js を開き、行番号6のガターをクリックするか、F9を押してブレークポイントを配置します。

res.render('index', { title: 'Express' });

さあ、ブラウザーで https://:3000 にアクセスし、期待通りにブレークポイントがヒットすることを確認してください!

拡張機能をインストールする

通常の VS Code インスタンスと同様に、開発コンテナーにアタッチしている間でも拡張機能をインストールして使用できます。

拡張機能の種類に応じて、クライアント側で実行されるか、リモート VS Code サーバー上のコンテナー内で実行されます。テーマやスニペットなど、主に UI ベースの拡張機能はクライアント側に残りますが、その他のすべての拡張機能はコンテナーにインストールされます。これにより、各環境で作業する際に必要な拡張機能のみを保持しつつ、すべての環境で一貫した UI を維持することができます。

拡張機能ビュー (⇧⌘X (Windows, Linux Ctrl+Shift+X)) を開くと、ローカルにインストールされている拡張機能と、現在のコンテナーインスタンスにインストールされている拡張機能のリストが表示されます。コンテナーにインストールする必要があるローカルにインストールされた拡張機能(以下の Azure Account 拡張機能など)は、グレー表示されます。

Remote Extensions view

拡張機能ビューで「gitlens」と入力し、アタッチされたコンテナーにインストールを選択して、GitLens 拡張機能をインストールしてみましょう。

Search for GitLens

これにより、VS Code の再起動が求められ、再起動すると、新しくインストールされた拡張機能とともにコンテナーと VS Code サーバーが再起動される間、Dev Containerをインストール中の通知が短時間表示されます。

また、先ほど見たコンテナー構成ファイルが再び開かれ、このイメージにアタッチするたびにインストールしたい拡張機能をリストする新しいプロパティで更新されていることに気づくでしょう。

{
  "workspace": "/usr/src/app",
  "extensions": ["eamodio.gitlens"]
}

それでは、任意のファイルを開き、コード行を選択すると、GitLens によって提供されるインラインの Git 情報が表示されることに注目してください!

GitLens information shown in the editor

クリーンアップ

作業が完了したら、コマンドパレットからリモート接続を閉じるコマンドを実行するか、単に VS Code ウィンドウを閉じてリモート接続を終了できます。

次に、ターミナル/コマンドプロンプトから docker-compose down を実行して、実行中のコンテナーを停止します。これにより、メモリが解放され、使用されていたポートも解放されます。

docker-compose down

これで、別のコンテナーを起動して別のプロジェクトで作業する準備ができました!

次のステップ

この記事では、Dev Containers 拡張機能を使用して、既存のコンテナー化されたアプリケーションにアタッチする方法について説明しました。

また、作成またはアタッチしたい開発環境を記述し、プロジェクトと共にチームメンバーと共有できる devcontainer.json を作成することもできます。

その他の役立つリソースには、完全な コンテナー内での開発 ドキュメント、高度なコンテナー構成、および Dev Containers 拡張機能を使用した分離された開発環境の構築に関する 入門チュートリアル があります。

リモートコーディングをお楽しみください!

Bowden Kelly, VS Code プログラムマネージャー @bowdenk7