改善磁碟效能
開發容器擴充功能預設會使用「繫結掛載」來掛載本機檔案系統中的原始碼。雖然這是最簡單的選項,但在 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 檔案系統中,您將看到效能提升,以及針對設定權限等事項的更佳相容性。
請參閱在 Windows 上於容器中開啟 WSL 2 資料夾,以取得從 VS Code 使用此新引擎的詳細資訊。
影片:加速 Windows 上的開發容器
使用「在容器磁碟區中複製存放庫」
開發容器:在容器磁碟區中複製存放庫... 命令會使用隔離的本機 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" ]
注意:您可以使用
${localWorkspaceFolderBasename}
、${devcontainerId}
或source
中的硬編碼名稱。 -
由於此存放庫以非 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) 執行開發容器:重建容器以選取變更。否則,請執行開發容器:在容器中開啟資料夾... 以連線至容器。
關於此方法的兩個注意事項
-
如果您刪除容器中的
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
資料夾中。
最後,使用檔案 > 開啟... / 開啟資料夾... 命令來開啟容器中複製的存放庫。