提高磁盘性能
Dev Containers 扩展默认使用“绑定挂载”从本地文件系统获取源代码。虽然这是最简单的方法,但在 macOS 和 Windows 上,运行像这样的命令时可能会遇到较慢的磁盘性能。yarn 安装从容器内部。有一些事情可以帮助您解决这些问题。
将您的源代码存储在Windows的WSL 2文件系统中
Windows 10 2004 及更高版本包含改进版本的 Windows 子系统 for Linux (WSL 2),提供完整的 Linux 内核,并且在性能上相比 WSL 1 有显著提升。Docker Desktop 2.3+ 包含一个新的 WSL 2 引擎,该引擎在 WSL 中运行 Docker 而不是在虚拟机中。因此,如果你将源代码存储在 WSL 2 文件系统中,你将看到性能的提升以及在设置权限等方面的更好兼容性。
参见在 Windows 上于容器中打开 WSL 2 文件夹,了解如何在 VS Code 中使用此新引擎的详细信息。
视频:在 Windows 上加速 Dev Container
在容器卷中使用克隆库
该Dev Containers: 在容器卷中克隆仓库...命令使用了一个隔离的、本地的Docker命名卷,而不是绑定到本地文件系统。除了不污染你的文件树之外,本地卷在Windows和macOS上还具有性能提升的额外好处。
参见在隔离的容器卷中打开Git仓库或GitHub PR以了解此方法的详细信息。
接下来的两节将概述如何在其他场景中使用命名卷。
使用目标命名卷
由于macOS和Windows在VM中运行容器,"bind"挂载不如直接使用容器的文件系统快。幸运的是,Docker有一个名为本地"命名卷"的概念,它可以像容器的文件系统一样工作,但可以在容器重建后仍然存在。这使得它非常适合存储像这样的软件包文件夹。节点模块数据文件夹或输出文件夹,例如构建在写入性能至关重要的情况下。根据您参考的内容,按照以下适当的步骤进行操作。devcontainer.json输入:.
Dockerfile 或镜像:
让我们使用 vscode-remote-try-node 仓库来说明如何加速 yarn 安装输入:.
请按照以下步骤操作:
-
使用
工作区挂载物业在devcontainer.json告诉 VS Code 源代码的位置。然后使用安装属性 (VS Code 1.41+) 用于挂载节点模块将子文件夹转换为命名的本地卷。"挂载": [ "源=${localWorkspaceFolderBasename}-node_modules,目标=${containerWorkspaceFolder}/node_modules,类型=卷" ]注意:您可以使用
${本地工作区文件夹基名},${开发容器ID},或硬编码的名称在源输入:. -
由于这个仓库以非根用户 "node" 运行 VS Code,我们需要添加一个
创建命令后确保用户可以访问该文件夹。"远程用户": "节点", "挂载点": [ "源=${本地工作区文件夹基本名称}-node_modules,目标=${容器工作区文件夹}/node_modules,类型=卷" ], "创建后命令": "sudo chown node node_modules"如果将要在这个容器中运行,则不需要这第二步。
根输入:.
如果你已经构建了容器并连接到它,请在命令面板 (F1) 中运行 Dev Containers: 重新构建容器 以拾取更改。否则,请运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。
对此方法的两点说明:
-
如果你删除
节点模块在容器中删除文件夹,它可能会失去与卷的连接。删除文件夹的内容节点模块需要时使用文件夹rm -rf node_modules/* node_modules/.*)。 -
你会发现一个空的
节点模块通过此方法在本地创建文件夹。这是因为容器中的卷挂载点在本地文件系统绑定挂载内。这是预期的并且无害。
Docker Compose:
虽然 vscode-remote-try-node 不使用 Docker Compose,但步骤相似,但是卷挂载配置放在不同的文件中。
-
在你的Docker Compose文件(或一个扩展的文件)中,添加一个命名的本地卷挂载到
节点模块子文件夹用于相应的服务。例如:版本:'3' 服务: your-service-name-here: 卷: # 或者你挂载源代码的地方 - .:/workspace:cached - try-node-node_modules:/workspace/node_modules # ... 卷: 尝试节点节点_modules: -
接下来,确保
工作区文件夹物业在devcontainer.json匹配实际源代码挂载的位置:"工作区文件夹": "/工作区" -
如果你在容器中以非根用户运行,请添加一个
创建命令后更新挂载文件夹的所有者,因为它可能以 root 用户挂载。替换用户名称填写此处与合适的用户。"远程用户": "节点", "工作区文件夹": "/工作区", "创建后命令": "sudo chown 用户名-替换-这里 node_modules"
如果你已经构建了容器并连接到它,请在命令面板 (F1) 中运行 Dev Containers: 重新构建容器 以拾取更改。否则,请运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。
视频:加快在开发容器中的npm install速度
使用命名卷来替代整个源代码树
最后,如果以上选项都不符合您的需求,您可以更进一步将整个源代码树克隆到命名卷中,而不是在本地。您可以通过对现有的devcontainer.json配置并按如下方式进行修改(更新你的音量名称在这里用你想要称呼的音量。
根据你参考的内容devcontainer.json输入:
-
Dockerfile 或者 image:在以下位置使用以下属性
devcontainer.json挂载本地命名卷到容器中:"工作区挂载": "源=你的卷名-here,目标=/workspacem,类型=卷" "工作区文件夹": "/workspacem", -
Docker Compose:更新(或 扩展)你的
docker-compose.yml对于适当的客户服务如下:版本:'3' 服务: your-service-name-here: 卷: - your-volume-name-here:/workspace # ... 卷: 你的卷名在这里:您还希望确保
工作区文件夹物业在devcontainer.json匹配挂载位置(或卷内的子文件夹):"工作区文件夹": "/工作区"
如果你已经构建了容器并连接到它,请在命令面板 (F1) 中运行 Dev Containers: 重新构建容器 以拾取更改。否则,请运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。
接下来,可以使用Git: 克隆命令从命令面板,或者启动集成终端 (⌃⇧` (Windows, Linux Ctrl+Shift+`)) 并使用克隆仓库命令将你的源代码克隆到/工作区文件夹。
最后,使用文件 > 打开... / 打开文件夹... 命令在容器中打开克隆的仓库。