ディスク パフォーマンスの向上
Dev Containers 拡張機能は、デフォルトでローカルファイルシステムのソースコードに対して「バインド マウント」を使用します。これは最も簡単なオプションですが、macOS および Windows では、コンテナー内から yarn install などのコマンドを実行する際にディスクパフォーマンスが低下する場合があります。このような問題に対処するための方法がいくつかあります。
Windows の WSL 2 ファイルシステムにソースコードを保存する
Windows 10 バージョン 2004 以降には、完全な Linux カーネルを提供し、WSL 1 よりもパフォーマンスが大幅に向上した Windows Subsystem for Linux (WSL 2) の改良版が含まれています。Docker Desktop 2.3 以降には、VM 内ではなく WSL 内で Docker を実行する新しい WSL 2 エンジンが含まれています。したがって、ソースコードを WSL 2 ファイルシステムに保存すると、アクセス権の設定などの互換性が向上するとともに、パフォーマンスが向上します。
VS Code からこの新しいエンジンを使用する方法の詳細については、Windows のコンテナーで WSL 2 フォルダーを開くを参照してください。
動画: Windows で Dev Containers の速度を向上させる
コンテナー ボリュームでのリポジトリの複製 (Clone Repository in Container Volume) の使用
Dev Containers: Clone Repository in Container Volume... コマンドは、ローカルファイルシステムにバインドする代わりに、分離されたローカルの Docker 名前付きボリュームを使用します。ファイルツリーを汚さないことに加え、ローカルボリュームには Windows および macOS でパフォーマンスが向上するという利点もあります。
このアプローチの使用方法の詳細については、分離されたコンテナー ボリュームでの Git リポジトリまたは GitHub PR のオープンを参照してください。
次の 2 つのセクションでは、他のシナリオで名前付きボリュームを使用する方法の概要について説明します。
ターゲットを指定した名前付きボリュームの使用
macOS および Windows ではコンテナーが VM 内で実行されるため、「バインド」マウントは、コンテナーのファイルシステムを直接使用する場合ほど高速ではありません。幸い、Docker には、コンテナーのファイルシステムのように機能しつつ、コンテナーの再構築後も存続するローカルの「名前付きボリューム」という概念があります。これにより、書き込みパフォーマンスが重要な node_modules などのパッケージフォルダー、データフォルダー、または build などの出力フォルダーを保存するのに最適です。devcontainer.json で参照しているものに基づいて、以下の適切な手順に従ってください。
Dockerfile またはイメージ:
yarn install の速度を向上させる方法を説明するために、vscode-remote-try-node リポジトリを使用しましょう。
次の手順を実行します。
-
devcontainer.jsonのworkspaceMountプロパティを使用して、ソースコードをバインドする場所を VS Code に指示します。次に、mountsプロパティ (VS Code 1.41 以降) を使用して、代わりにnode_modulesサブフォルダーを名前付きローカルボリュームにマウントします。"mounts": [ "source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume" ]メモ:
sourceでは、${localWorkspaceFolderBasename}、${devcontainerId}、またはハードコーディングされた名前を使用できます。 -
このリポジトリでは VS Code が root 以外の「node」ユーザーとして実行されるため、ユーザーがフォルダーに確実にアクセスできるようにするために
postCreateCommandを追加する必要があります。"remoteUser": "node", "mounts": [ "source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume" ], "postCreateCommand": "sudo chown node node_modules"コンテナー内で
rootとして実行する場合は、この 2 番目の手順は必要ありません。
すでにコンテナをビルドして接続している場合は、コマンドパレット (F1) から Dev Containers: Rebuild Container を実行して変更を反映させてください。それ以外の場合は、Dev Containers: Open Folder in Container... を実行してコンテナに接続してください。
このアプローチに関する 2 つの注意事項
-
コンテナー内の
node_modulesフォルダーを削除すると、ボリュームとの接続が失われる可能性があります。必要な場合は、フォルダー自体の代わりにnode_modulesフォルダーの内容を削除してください (rm -rf node_modules/* node_modules/.*)。 -
この方法では、空の
node_modulesフォルダーがローカルに作成されることがわかります。これは、コンテナー内のボリュームマウントポイントが、ローカルファイルシステムのバインドマウント内にあるためです。これは予期された動作であり、害はありません。
Docker Compose:
vscode-remote-try-node は Docker Compose を使用しませんが、手順は同様であり、ボリュームマウントの構成が別のファイルに記述されます。
-
Docker Compose ファイル (または拡張ファイル) で、該当するサービスの
node_modulesサブフォルダーに名前付きローカルボリュームマウントを追加します。例:version: '3' services: your-service-name-here: volumes: # Or wherever you've mounted your source code - .:/workspace:cached - try-node-node_modules:/workspace/node_modules # ... volumes: try-node-node_modules: -
次に、
devcontainer.jsonのworkspaceFolderプロパティが、実際のソースコードがマウントされている場所と一致していることを確認します"workspaceFolder": "/workspace" -
root 以外のユーザーでコンテナーを実行している場合は、root としてマウントされている可能性があるため、マウントしたフォルダーの所有者を更新する
postCreateCommandを追加します。user-name-goes-hereを適切なユーザーに置き換えてください。"remoteUser": "node", "workspaceFolder": "/workspace", "postCreateCommand": "sudo chown user-name-goes-here node_modules"
すでにコンテナをビルドして接続している場合は、コマンドパレット (F1) から Dev Containers: Rebuild Container を実行して変更を反映させてください。それ以外の場合は、Dev Containers: Open Folder in Container... を実行してコンテナに接続してください。
動画: 開発コンテナーでの npm install の高速化
ソースツリー全体に名前付きボリュームを使用する
最後に、上記のどのオプションも要件を満たさない場合は、一歩進んで、ローカルではなくソースツリー全体を名前付きボリューム内に複製することができます。既存の devcontainer.json 構成を取得し、次のように変更することで、名前付きボリュームを設定できます (your-volume-name-here はボリュームに付ける名前に置き換えます)。
devcontainer.json で参照しているものに応じて、次のようにします。
-
Dockerfile またはイメージ:
devcontainer.jsonで次のプロパティを使用して、ローカルの名前付きボリュームをコンテナーにマウントします"workspaceMount": "source=your-volume-name-here,target=/workspace,type=volume" "workspaceFolder": "/workspace", -
Docker Compose: 該当するサービスに対して、
docker-compose.ymlを次のように更新 (または拡張) しますversion: '3' services: your-service-name-here: volumes: - your-volume-name-here:/workspace # ... volumes: your-volume-name-here:また、
devcontainer.jsonのworkspaceFolderプロパティが、ボリュームがマウントされている場所 (またはボリューム内のサブフォルダー) と一致していることを確認してください"workspaceFolder": "/workspace"
すでにコンテナをビルドして接続している場合は、コマンドパレット (F1) から Dev Containers: Rebuild Container を実行して変更を反映させてください。それ以外の場合は、Dev Containers: Open Folder in Container... を実行してコンテナに接続してください。
次に、コマンド パレットから Git: Clone コマンドを使用するか、統合ターミナルを起動して (⌃⇧` (Windows、Linux Ctrl+Shift+`))、git clone コマンドを使用してソースコードを /workspace フォルダーに複製します。
最後に、[ファイル] > [開く...] / [フォルダーを開く...] コマンドを使用して、コンテナー内で複製したリポジトリを開きます。