提升磁盘性能
Dev Containers 扩展默认使用“绑定挂载”来访问本地文件系统中的源代码。虽然这是最简单的选项,但在 macOS 和 Windows 上,从容器内部运行 yarn install
等命令时,您可能会遇到磁盘性能较慢的问题。有一些方法可以解决这类问题。
在 Windows 上的 WSL 2 文件系统中存储源代码
Windows 10 2004 及更高版本包含改进版的适用于 Linux 的 Windows 子系统 (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}
或硬编码名称。 -
由于此仓库以非 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) 运行 Dev Containers: 重建容器以应用更改。否则,运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。
关于此方法的两点说明
-
如果您删除容器中的
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) 运行 Dev Containers: 重建容器以应用更改。否则,运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。
视频:加速开发容器中的 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: 重建容器以应用更改。否则,运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。
接下来,可以从命令面板使用 Git: Clone 命令,或者启动集成终端 (⌃⇧` (Windows, Linux Ctrl+Shift+`)),然后使用 git clone
命令将源代码克隆到 /workspace
文件夹中。
最后,使用 文件 > 打开... / 打开文件夹... 命令在容器中打开克隆的仓库。