VS Code 用 Dev Container 固化扩展与开发依赖
最终结果:把 .devcontainer/devcontainer.json 提交到仓库后,团队成员可以让 VS Code 在同一类容器环境中打开项目。基础镜像负责 Node.js 运行时,Features 负责常用 CLI,customizations.vscode 负责容器内扩展和设置,postCreateCommand 负责安装项目依赖。以后换电脑或新成员加入,不再靠一份口头安装清单恢复环境。
VS Code 官方文档:https://code.visualstudio.com/docs/devcontainers/create-dev-container
Dev Container 规范:https://containers.dev/
开始前需要在本机安装 Docker、VS Code 和 Dev Containers 扩展。本文以带 package-lock.json 的 Node.js 项目为例,重点不是“容器能打开”,而是重建后如何证明运行时、工具、扩展、依赖和端口都符合预期。
最终结果:仓库里保存一份可重建环境

完成后,仓库至少包含以下结构:
project/ ├── .devcontainer/ │ └── devcontainer.json # 容器、扩展、设置和初始化命令 ├── package.json # 项目依赖声明 └── package-lock.json # 锁定依赖解析结果
devcontainer.json 固化开发环境,lockfile 固化项目依赖解析。两者要一起进入版本控制,才能同时减少“机器差异”和“依赖漂移”。
创建 devcontainer.json
在项目根目录新建 .devcontainer/devcontainer.json。下面的 JSON 保持严格有效,因此没有插入注释;各字段随后逐项解释。
{
"name": "team-node-workspace",
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
"features": {
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"customizations": {
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
],
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.validate": ["javascript", "typescript"]
}
}
},
"forwardPorts": [3000],
"portsAttributes": {
"3000": {
"label": "Web App",
"onAutoForward": "notify"
}
},
"postCreateCommand": "npm ci",
"remoteUser": "node"
}
| 字段 | 固化内容 | 结果核对 |
|---|---|---|
| image | 操作系统和 Node.js 运行时基础 | node --version 与预期主版本一致 |
| features | Git、GitHub CLI 等开发工具 | 对应命令在容器内可执行 |
| customizations.vscode | 容器内扩展与编辑器设置 | 扩展列表存在,保存格式化生效 |
| forwardPorts | 需要从容器访问的服务端口 | 应用启动后端口可访问 |
| postCreateCommand | 容器首次创建后的项目初始化 | npm ci 成功,依赖目录可用 |
| remoteUser | VS Code Server 和子进程的容器用户 | 新文件不会意外归 root 所有 |
为什么扩展要写在 customizations.vscode
本机安装的扩展和容器内扩展是两个环境。语言服务、格式化器、调试器往往需要在容器侧运行,所以不能只要求成员在本机扩展面板里手工安装。把扩展 ID 写进 customizations.vscode.extensions 后,VS Code 创建环境时会按配置安装。
扩展 ID 可以从扩展详情中确认。团队应只加入项目确实需要的扩展:语言服务、格式化、Lint、测试和调试工具适合固化;主题、图标、个人效率工具通常留在个人设置中,避免把偏好误写成项目约束。
开发工具放 Features,项目依赖交给 lockfile
Git、GitHub CLI、Java、Go、Python 等可复用工具适合使用 Dev Container Features。Feature 是可组合的安装与配置单元,能让 devcontainer.json 保持清晰。需要操作系统原生包或自定义构建步骤时,再切换到 Dockerfile。
postCreateCommand 更适合运行依赖仓库文件的初始化命令。示例使用 npm ci,它要求仓库中有 lockfile。若项目没有 package-lock.json,应先建立明确的依赖管理策略,而不是直接把命令换成每次都可能重新解析版本的安装流程。
重新打开与重建的操作流程
- 在 VS Code 中打开项目文件夹。
- 从命令面板运行 Dev Containers: Reopen in Container。
- 等待镜像准备、Feature 安装和
postCreateCommand完成。 - 修改
.devcontainer下的配置后,运行 Dev Containers: Rebuild Container。 - 重建完成后执行验收命令,不以“窗口重新打开”作为唯一成功标准。
第一次进入项目用 Reopen;已经在容器中、但基础镜像、Feature、扩展清单或初始化命令发生变化时用 Rebuild。只重载窗口通常不会重新执行完整容器构建。
中间状态:配置修改后哪些步骤会重新运行
| 变更 | 建议动作 | 重点观察 |
|---|---|---|
| 扩展或 settings | 重建并重新打开 | 扩展安装与容器侧设置 |
| image 或 Features | 重建容器 | 镜像拉取、Feature 安装日志 |
| package-lock.json | 重新执行 npm ci,必要时重建 | 依赖安装是否与 lockfile 一致 |
| forwardPorts | 重新打开或重建 | 应用启动后端口转发状态 |
| remoteUser | 重建容器 | 文件所有者和写入权限 |
结果验收:五项检查不能只看容器能否打开

在容器内执行下面的检查。Shell 支持注释,所以每组命令直接标明核对目标:
# 1. 核对容器操作系统和当前用户 cat /etc/os-release id # 2. 核对运行时与包管理器版本 node --version npm --version # 3. 核对由 Features 或基础镜像提供的 CLI git --version gh --version # 4. 核对容器侧扩展,不要只看本机扩展 code --list-extensions --show-versions | sort # 5. 核对项目依赖是否完成安装 test -d node_modules && echo "node_modules ready" npm ls --depth=0
扩展清单中应至少出现 dbaeumer.vscode-eslint 和 esbenp.prettier-vscode。随后启动项目服务,再检查 3000 端口是否能从本机访问。若项目脚本是 npm run dev,可以这样运行:
# 启动项目定义的开发服务,确认端口转发可用 npm run dev
命令是否存在、具体监听地址和端口由项目脚本决定。若服务只监听 127.0.0.1 且框架要求显式开放容器访问,需要按该框架的配置改为合适的监听地址。
异常修正
扩展没有安装到容器
先确认扩展 ID 拼写正确,并位于 customizations.vscode.extensions。然后执行 Rebuild Container。还要区分“本机已安装”和“容器内已安装”,以 code --list-extensions 的容器侧结果为准。
npm ci 失败导致容器初始化中断
检查 package-lock.json 是否存在且与 package.json 匹配。若网络需要代理或私有 registry,不要把令牌明文写入仓库;应通过团队批准的凭据或环境注入方式提供。修正后重新运行初始化命令或重建容器。
新增文件归 root,宿主机无法修改
确认基础镜像存在配置的非 root 用户,并核对 remoteUser。Docker Compose 场景还需要检查服务的 user、挂载目录权限和 UID/GID 映射。权限修正通常需要重建才能完整生效。
修改配置后环境没有变化
仅关闭再打开窗口不一定重建镜像。对于 image、Features、Dockerfile 或用户设置变化,明确运行 Rebuild Container,并在重建日志后重新执行五项验收。
配置该如何归档
- 提交
.devcontainer/devcontainer.json和相关 Dockerfile、Compose 文件; - 提交
package-lock.json,让依赖安装结果可重复; - 在项目 README 记录 Reopen、Rebuild、启动和验收命令;
- 不要提交访问令牌、私钥、个人代理密码或机器专属路径;
- 升级镜像、Feature 或运行时后,记录变更原因和验收结果。
交付速查表
| 检查项 | 通过标准 | 失败后动作 |
|---|---|---|
| 容器身份 | 操作系统、用户和工作目录符合预期 | 检查 image、remoteUser 和挂载 |
| Node 版本 | 团队约定的主版本一致 | 调整镜像标签并重建 |
| CLI 工具 | Git、gh 等命令可执行 | 修正 Features 或 Dockerfile |
| VS Code 扩展 | 必需扩展出现在容器清单 | 修正 customizations 并重建 |
| 项目依赖 | npm ci 成功,npm ls 无关键错误 | 检查 lockfile、网络和权限 |
| 服务端口 | 应用启动且转发端口可访问 | 检查监听地址、端口和脚本 |
Dev Container 的价值不是把开发搬进 Docker 就结束,而是把“如何得到可工作的开发环境”变成仓库中可审查、可重建、可验收的配置。只要每次修改后都走一遍版本、扩展、依赖和端口检查,这套环境才能真正成为团队资产。
设计只由发送方关闭的多阶段数据管道
- 上一篇
- 设计只由发送方关闭的多阶段数据管道
- 下一篇
- 无缓冲和有缓冲 Channel 的选择应看吞吐还是同步语义
-
- 文章 · 软件教程 | 3小时前 | 开发环境 · VS Code SSH配置 Remote SSH 远端设置 Remote Settings
- VS Code Remote SSH 连接后配置远端专属设置
- 233浏览 收藏
-
- 文章 · 软件教程 | 5小时前 |
- VS Code 创建项目专用 Profile 并只同步需要的配置
- 396浏览 收藏
-
- 文章 · 软件教程 | 9小时前 | 软件教程 · 环境变量 接口测试 Postman Collection Runner
- Postman 怎么用 Collection Runner 注入不同环境变量
- 440浏览 收藏
-
- 文章 · 软件教程 | 11小时前 | Chrome Chrome DevTools 性能追踪 Performance
- Chrome DevTools 怎么导出并重新载入性能追踪
- 128浏览 收藏
-
- 文章 · 软件教程 | 13小时前 | 开发环境 · Git Git worktree 现有分支 独立目录 多工作树
- Git worktree 怎么把现有分支签出到独立目录
- 195浏览 收藏
-
- 文章 · 软件教程 | 16小时前 |
- IntelliJ IDEA Local History 怎么恢复未提交的目录
- 241浏览 收藏
-
- 文章 · 软件教程 | 17小时前 | docker · 软件教程 · Docker Compose 单服务构建 with-dependencies 容器重建 Compose依赖
- Docker Compose 怎么只重新构建一个服务及其依赖
- 403浏览 收藏
-
- 文章 · 软件教程 | 20小时前 | docker · provenance SBOM BuildKit Docker Buildx 镜像来源证明
- Docker Buildx 怎么给镜像同时生成 SBOM 和来源证明
- 335浏览 收藏
-
- 文章 · 软件教程 | 1天前 | github · 故障排查 · CI/CD · gitHub actions · GitHub Actions 失败任务 Job workflow run 重跑任务
- GitHub Actions 怎么手动重跑单个失败任务
- 162浏览 收藏
-
- 文章 · 软件教程 | 1天前 | 开发环境 · vs code · VS Code Docker Compose Dockerfile devcontainer.json Dev Containers
- VS Code Dev Containers 修改配置后怎么完整重建容器
- 368浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 361次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 417次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 430次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 384次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 209次使用
-
- Slack工作区、频道和线程怎么区分?协作功能与官方入口说明
- 2026-08-13 350浏览
-
- Slack主页跳到哪里登录?工作区地址、帮助中心与域名核对
- 2026-08-13 454浏览
-
- Slack桌面端登录失败怎么办?网页版回退、手机通知与更新检查
- 2026-08-14 197浏览
-
- Slack登录页面一直转圈怎么办?浏览器兼容、网络检查与官方回退路径
- 2026-08-14 425浏览
-
- Slack工作区地址进不去怎么办?网页版回退、客户端更新与权限核对
- 2026-08-14 287浏览

