現已釋出!閱讀關於 11 月新增功能和修復的內容。

提高磁碟效能

Dev Containers 擴充套件預設使用“繫結掛載”來在本地檔案系統上定位原始碼。雖然這是最簡單的選項,但在 macOS 和 Windows 上,在容器內部執行 yarn install 等命令時,可能會遇到較慢的磁碟效能。您可以透過以下幾種方法來解決此類問題。

在 Windows 上的 WSL 2 檔案系統中儲存原始碼

Windows 10 2004 及更高版本包含改進的 Windows Subsystem for Linux (WSL 2) 版本,它提供完整的 Linux 核心,並且效能比 WSL 1 顯著提高。Docker Desktop 2.3+ 包含一個新的 WSL 2 引擎,可在 WSL 而不是 VM 中執行 Docker。因此,如果您將原始碼儲存在 WSL 2 檔案系統中,您將看到效能提升,並且在設定許可權等方面具有更好的相容性。

有關如何從 VS Code 使用此新引擎的詳細資訊,請參閱在 Windows 上的容器中開啟 WSL 2 資料夾

影片:加速 Windows 上的開發容器

使用“克隆儲存庫到容器卷”

Dev Containers: Clone Repository in Container Volume...(Dev Containers:克隆儲存庫到容器卷...)命令使用隔離的本地 Docker 命名卷,而不是繫結到本地檔案系統。除了不會汙染檔案樹之外,本地卷還具有在 Windows 和 macOS 上提高效能的額外好處。

有關使用此方法的詳細資訊,請參閱在隔離的容器卷中開啟 Git 儲存庫或 GitHub PR

接下來的兩節將概述如何在其他場景中使用命名卷。

使用有針對性的命名卷

由於 macOS 和 Windows 在 VM 中執行容器,“繫結”掛載不如直接使用容器的檔案系統快。幸運的是,Docker 有一個本地“命名卷”的概念,它可以像容器的檔案系統一樣執行,但可以在容器重建後保留下來。這使其非常適合儲存像 node_modules 這樣的包資料夾、資料資料夾或像 build 這樣對寫入效能至關重要的輸出資料夾。根據您在 devcontainer.json 中引用的內容,遵循以下適當的步驟。

Dockerfile 或映象:

讓我們使用 vscode-remote-try-node 儲存庫來演示如何加速 yarn install

請按照以下步驟操作:

  1. 使用 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} 或硬編碼名稱。

  2. 由於此儲存庫以非 root 使用者“node”執行 VS Code,我們需要新增 postCreateCommand 以確保該使用者可以訪問該資料夾。

    "remoteUser": "node",
    "mounts": [
        "source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume"
    ],
    "postCreateCommand": "sudo chown node node_modules"
    

    如果您以 root 身份在容器中執行,則不需要第二步。

如果您已經構建了容器並連線到它,請從命令面板 (F1) 執行 開發容器:重建容器 以應用更改。否則,執行 開發容器:在容器中開啟資料夾... 以連線到容器。

有關此方法的兩個注意事項

  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.json 中的 workspaceFolder 屬性與實際原始碼掛載的位置匹配

    "workspaceFolder": "/workspace"
    
  3. 如果您以非 root 使用者在容器中執行,請新增 postCreateCommand 來更新您掛載的資料夾的所有者,因為它可能已以 root 身份掛載。將 user-name-goes-here 替換為相應的使用者。

    "remoteUser": "node",
    "workspaceFolder": "/workspace",
    "postCreateCommand": "sudo chown user-name-goes-here node_modules"
    

如果您已經構建了容器並連線到它,請從命令面板 (F1) 執行 開發容器:重建容器 以應用更改。否則,執行 開發容器:在容器中開啟資料夾... 以連線到容器。

影片:加速開發容器中的 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) 執行 開發容器:重建容器 以應用更改。否則,執行 開發容器:在容器中開啟資料夾... 以連線到容器。

接下來,要麼使用命令面板中的 Git: Clone 命令,要麼啟動整合終端 (⌃⇧` (Windows, Linux Ctrl+Shift+`)),並使用 git clone 命令將原始碼克隆到 /workspace 資料夾中。

最後,使用 檔案 > 開啟... / 開啟資料夾... 命令在容器中開啟克隆的儲存庫。

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