本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

提高磁盘性能

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 安装输入:.

请按照以下步骤操作:

  1. 使用工作区挂载物业在devcontainer.json告诉 VS Code 源代码的位置。然后使用安装属性 (VS Code 1.41+) 用于挂载节点模块将子文件夹转换为命名的本地卷。

    "挂载": [
        "源=${localWorkspaceFolderBasename}-node_modules,目标=${containerWorkspaceFolder}/node_modules,类型=卷"
    ]
    

    注意:您可以使用${本地工作区文件夹基名}${开发容器ID},或硬编码的名称在输入:.

  2. 由于这个仓库以非根用户 "node" 运行 VS Code,我们需要添加一个创建命令后确保用户可以访问该文件夹。

    "远程用户": "节点",
    "挂载点": [
        "源=${本地工作区文件夹基本名称}-node_modules,目标=${容器工作区文件夹}/node_modules,类型=卷"
    ],
    "创建后命令": "sudo chown node node_modules"
    

    如果将要在这个容器中运行,则不需要这第二步。输入:.

如果你已经构建了容器并连接到它,请在命令面板 (F1) 中运行 Dev Containers: 重新构建容器 以拾取更改。否则,请运行 Dev Containers: 在容器中打开文件夹... 以连接到容器。

对此方法的两点说明:

  1. 如果你删除节点模块在容器中删除文件夹,它可能会失去与卷的连接。删除文件夹的内容节点模块需要时使用文件夹rm -rf node_modules/* node_modules/.*)。

  2. 你会发现一个空的节点模块通过此方法在本地创建文件夹。这是因为容器中的卷挂载点在本地文件系统绑定挂载内。这是预期的并且无害。

Docker Compose

虽然 vscode-remote-try-node 不使用 Docker Compose,但步骤相似,但是卷挂载配置放在不同的文件中。

  1. 在你的Docker Compose文件(或一个扩展的文件)中,添加一个命名的本地卷挂载到节点模块子文件夹用于相应的服务。例如:

    版本'3'
    服务
      your-service-name-here
    
          # 或者你挂载源代码的地方
          - .:/workspace:cached
          - try-node-node_modules:/workspace/node_modules
        # ...
    
    :
      尝试节点节点_modules:
    
  2. 接下来,确保工作区文件夹物业在devcontainer.json匹配实际源代码挂载的位置:

    "工作区文件夹": "/工作区"
    
  3. 如果你在容器中以非根用户运行,请添加一个创建命令后更新挂载文件夹的所有者,因为它可能以 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+`)) 并使用克隆仓库命令将你的源代码克隆到/工作区文件夹。

最后,使用文件 > 打开... / 打开文件夹... 命令在容器中打开克隆的仓库。