Dev Container 教程 (二) 使用预构建加速流程
我在之前的文章介绍了 Dev Container 的基本使用, 但容器构建耗时过长的问题还未探讨, 本文将通过预构建(prebuild)技术, 彻底解决这一痛点
前置条件
- 已阅读 Dev Container 教程 (一) 基本使用
- 已安装 Node.js 环境(包含 npm 包管理工具), 官网下载地址
简单示例
下面以 Go 开发环境为例, 演示如何配置一个基本的 Dev Container
新建 go-prebuild 目录并添加下面文件
{
"name": "Go",
"image": "mcr.microsoft.com/devcontainers/go:1-1.24-bookworm",
"features": {
"ghcr.io/mrsimonemms/devcontainers/cobra-cli:1": {}
},
"customizations": {
"vscode": {
"settings": {
"window.newWindowProfile": "Default", // 新窗口使用的配置文件, 只能在"默认配置文件"中设置
"files.autoSave": "afterDelay", // 自动保存文件
"editor.formatOnSave": true, // 保存时自动格式化
"files.simpleDialog.enable": true, // 简单对话框, ctrl+n 新建文件时不再弹出对话框
"editor.insertSpaces": true, // 使用空格代替制表符
"editor.tabSize": 4, // 缩进空格数
"editor.autoClosingDelete": "always", // 删除左括号时总是自动删除右括号
"editor.minimap.autohide": "mouseover", // 鼠标不在缩略图上时隐藏缩略图, 鼠标在缩略图上时显示缩略图
"terminal.integrated.cursorStyle": "underline", // 终端光标样式使用下划线
"explorer.confirmDelete": false, // 删除文件时不再弹出确认对话框
"explorer.confirmDragAndDrop": false, // 拖放移动文件或文件夹时不再弹出确认对话框
"vsicons.dontShowNewVersionMessage": true, // 不显示新版本消息
"workbench.iconTheme": "vscode-icons" // 使用 vscode-icons 图标主题
},
"extensions": [
"mhutchie.git-graph", // Git 图形化视图
"eamodio.gitlens", // Git 增强工具, 主要为了能显示代码作者
"vscode-icons-team.vscode-icons", // VSCode 图标主题
"github.copilot", // GitHub Copilot, AI 代码补全
"github.copilot-chat" // GitHub Copilot Chat, AI 聊天助手
]
}
},
"containerEnv": {
"GOPROXY": "https://goproxy.io,direct"
},
"runArgs": [
"--name",
"go-container"
]
}
关键参数解析
features
: 配置添加功能模块, 这里添加Go命令行工具 cobra-clicustomizations
: 个性化配置, 这里提供我的VSCocde设置和插件以供参考containerEnv
: 设置环境变量, 这里通过环境变量设置Go镜像源runArgs
: 传递给 Docker CLI 的参数, 这里给启动容器命名为go-container
, 方便查找
Features
Features 是 Dev Container 一项比较强大的能力, 它将常见的开发环境配置封装为可复用的模块, 使环境配置变得简单高效
Features 核心优势
- 模块化设计
- 将常见开发环境配置拆分为独立的、可组合的功能单元
- 每个 Feature 专注于单一职责(如安装特定语言运行时、配置工具链等)
- 可根据项目需求灵活组合不同 Features
- 简化配置
- 无需再编写复杂的 Dockerfile 或处理繁琐的安装脚本
- 通过简单的声明式语法在 devcontainer.json 中添加功能
在 VSCode 中,可以通过可视化界面轻松添加 Features:
官方和社区提供了很多常用的 Features, 具体可以参考 Available Dev Container Features
添加插件
Dev Container 支持在容器内预装 VS Code 插件, 确保开发环境开箱即用. 配置插件有两种方式:
- 手动添加: 将插件 ID 添加到 devcontainer.json 的 extensions 数组中
- 可视化操作: 在 VSCode 界面中管理插件
推荐实践: 对于团队项目, 建议在 devcontainer.json 中明确指定必要插件, 确保所有成员使用一致的开发环境
预构建
安装 Dev Container CLI
npm install -g @devcontainers/cli
构建自定义镜像
在项目目录执行以下命令构建镜像:
devcontainer build --workspace-folder . --image-name go-devcontainer:0.1
构建成功后, 您将获得一个包含完整开发环境的 Docker 镜像, 可直接用于创建 Dev Container
使用预构建镜像
新建 go-demo 目录, 创建 devcontainer.json 文件
{
"name": "go-demo",
"image": "go-devcontainer:0.1"
}
通过 Ctrl + Shift + P 打开命令面板, 输入 "Reopen in Container" 并执行, VSCode 将使用预构建镜像启动开发环境
静待 VSCode 启动 VSCode Server, 下载并激活必要的插件, 接下来就可以愉快的开发了
镜像分发策略
预构建的镜像可推送到私有或公共镜像仓库, 解决网络环境限制问题:
docker tag go-devcontainer:0.1 registry.cn-hangzhou.aliyuncs.com/lepo/go-devcontainer:0.1
docker push registry.cn-hangzhou.aliyuncs.com/lepo/go-devcontainer:0.1
也可以直接一步到位, 构建镜像并推送到镜像仓库
devcontainer build --workspace-folder . --push true --image-name <my_image_name>:<optional_image_version>
离线模式
预构建虽解决了镜像构建问题, 但仍需要网络下载 VSCode Server 和插件. 以下 方法可实现真正的离线开发环境
直接将容器打包成镜像
- 首先启动一个已配置好的容器
- 将运行中的容器保存为新镜像
我们在先前的示例中已启动一个命名为 go-container 的容器, 可以直接将其保存为镜像
docker commit go-container go-devcontainer-offline:0.1
使用离线镜像
新建 go-demo-offline 目录, 创建 devcontainer.json 文件
{
"name": "go-demo-offline",
"image": "go-devcontainer-offline:0.1"
}
此时, 即使完全断开网络连接, 也能成功启动开发环境, 并且相关的环境配置, 插件安装均已准备就绪, 开箱即用
此方法会将容器内所有数据(包括可能的敏感信息)打包到镜像中, 请务必:
- 在提交前清理容器内的敏感数据
- 避免将包含用户凭证的容器提交到共享仓库
保存镜像
制作的镜像同样可以推送到私有仓库方便随时拉取开发环境, 或者可以保存为 tar 文件, 存到 U 盘随身携带
docker save -o go-devcontainer-offline.tar go-devcontainer-offline:0.1
后续可直接恢复镜像
docker load -i go-devcontainer-offline.tar
以后你就能火箭般🚀配好自己的开发环境, 从此成为最靓的仔 😎