Skip to main content

Advanced Containers

原文 Advanced Containers

改进磁盘性能

Remote - Containers 扩展默认使用挂载(bind mounts)方式将源码映射到容器内. 虽然在 Windows 和 macOS 中这种方式最简单, 但是在容器内运行 yarn install / npm install 等命令时会产生磁盘读写性能问题. 通过一下方式可以优化该问题.

在容器内clone仓库

使用命令 Remote-Containers: Clone Repository in Container Volume

使用命名卷(targed named volume)

因为 macOS 和 Windows 在VM中运行容器, bind 命令挂载方式共享文件没有直接使用容器内文件系统操作高效. 幸运的是Docker有个 命名卷(named volume) 概念, 可以优化磁盘读写问题.

Dockerfile 或者镜像

下面介绍将 node_modules 目录使用 volume 方式挂载到容器内的文件系统:

使用属性 workspaceMount 告诉 VS Code 源码在哪儿, 然后使用 mounts 属性将子目录 node_modules 挂载到本地volume中, 完整配置如下:

.devcontainer/devcontainer.json
{
"name": "Node.js Dev",
"build": {
"dockerfile": "Dockerfile",
"context": "."
},
"customizations": {
"vscode": {
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"extensions": [
"dbaeumer.vscode-eslint"
]
}
},
"forwardPorts": [
3000
],
"postCreateCommand": "npm install",
"workspaceMount": "source=${localWorkspaceFolder}/,target=/workspace,type=bind,consistency=cached",
"workspaceFolder": "/workspace",
"mounts": [
"source=your-volume-name-here,target=${containerWorkspaceFolder}/node_modules,type=volume"
]
// "remoteUser": "node",
// "postCreateCommand": "chown node node_modules && npm install"
}

注意 mounts 命令里的 source 指的是 volume 名称.

这种方式有两点需要注意:

  1. 不能在容器内删除目录 node_modules, 否则会容器会断开和volume的连接, 如果需要删除 node_modules, 可以删除该目录下的内容(而不是直接删除该目录): rm -rf node_modules/* node_modules/.*
  2. 你会发现本地会有一个空的 node_modules 文件夹, 可以忽略这个.