提升磁碟效能
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: 在容器卷中克隆儲存庫...”命令使用一個獨立的本地 Docker 命名卷,而不是繫結到本地檔案系統。除了不汙染您的檔案樹之外,本地卷還具有在 Windows 和 macOS 上提高效能的額外好處。
有關使用此方法的詳細資訊,請參閱在隔離的容器卷中開啟 Git 儲存庫或 GitHub PR。
接下來的兩個部分將概述如何在其他場景中使用命名卷。
使用目標命名卷
由於 macOS 和 Windows 在 VM 中執行容器,“繫結”掛載不如直接使用容器的檔案系統快。幸運的是,Docker 有一個本地“命名卷”的概念,它可以像容器的檔案系統一樣執行,但可以在容器重建後保留。這使其成為儲存包資料夾(如 node_modules
)、資料資料夾或輸出資料夾(如 build
)(寫入效能至關重要)的理想選擇。根據您在 devcontainer.json
中引用的內容,遵循以下適當的步驟。
Dockerfile 或映象:
讓我們使用 vscode-remote-try-node 儲存庫來演示如何加速 yarn install
。
請按照以下步驟操作:
-
在
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
身份在容器中執行,則不需要第二個步驟。
如果您已經構建了容器並連線到它,請從命令面板 (F1) 執行 開發容器:重建容器 以應用更改。否則,執行 開發容器:在容器中開啟資料夾... 以連線到容器。
關於此方法的兩點說明
-
如果您刪除容器中的
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 使用者身份在容器中執行,請新增一個
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: 克隆”命令或啟動整合終端(⌃⇧` (Windows, Linux Ctrl+Shift+`)),並使用 git clone
命令將原始碼克隆到 /workspace
資料夾中。
最後,使用“檔案 > 開啟... / 開啟資料夾...”命令在容器中開啟克隆的儲存庫。