ディスク パフォーマンスの向上

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 リポジトリを使用しましょう。

次の手順を実行します。

  1. devcontainer.jsonworkspaceMount プロパティを使用して、ソースコードをバインドする場所を VS Code に指示します。次に、mounts プロパティ (VS Code 1.41 以降) を使用して、代わりに node_modules サブフォルダーを名前付きローカルボリュームにマウントします。

    "mounts": [
        "source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume"
    ]
    

    メモ: source では、${localWorkspaceFolderBasename}${devcontainerId}、またはハードコーディングされた名前を使用できます。

  2. このリポジトリでは 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 つの注意事項

  1. コンテナー内の node_modules フォルダーを削除すると、ボリュームとの接続が失われる可能性があります。必要な場合は、フォルダー自体の代わりに node_modules フォルダーの内容を削除してください (rm -rf node_modules/* node_modules/.*)。

  2. この方法では、空の node_modules フォルダーがローカルに作成されることがわかります。これは、コンテナー内のボリュームマウントポイントが、ローカルファイルシステムのバインドマウント内にあるためです。これは予期された動作であり、害はありません。

Docker Compose:

vscode-remote-try-node は Docker Compose を使用しませんが、手順は同様であり、ボリュームマウントの構成が別のファイルに記述されます。

  1. 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:
    
  2. 次に、devcontainer.jsonworkspaceFolder プロパティが、実際のソースコードがマウントされている場所と一致していることを確認します

    "workspaceFolder": "/workspace"
    
  3. 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.jsonworkspaceFolder プロパティが、ボリュームがマウントされている場所 (またはボリューム内のサブフォルダー) と一致していることを確認してください

    "workspaceFolder": "/workspace"
    

すでにコンテナをビルドして接続している場合は、コマンドパレット (F1) から Dev Containers: Rebuild Container を実行して変更を反映させてください。それ以外の場合は、Dev Containers: Open Folder in Container... を実行してコンテナに接続してください。

次に、コマンド パレットから Git: Clone コマンドを使用するか、統合ターミナルを起動して (⌃⇧` (Windows、Linux Ctrl+Shift+`))、git clone コマンドを使用してソースコードを /workspace フォルダーに複製します。

最後に、[ファイル] > [開く...] / [フォルダーを開く...] コマンドを使用して、コンテナー内で複製したリポジトリを開きます。

© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.