节点深耕

DevContainer 实践:构建可复制的开发环境

本文总结 DevContainer 在多语言项目中的落地经验,覆盖定义、构建、连接和团队分发,帮助你减少本地环境漂移和版本冲突。

2023-12-01约 4 分钟阅读
#node #IaC #Go #Java

背景

在多语言、多项目并行开发下,本地环境很容易失控。即使有目录规范和版本管理器,工具链冲突依然会持续累积。

比如,一些工具是用 curl 安装的、自带 upgrade 命令,一些又是 brew。特别是切换版本时,可能这个项目需要 Terraform 1.3.5,另一个项目又需要 Terraform 1.2.0。加之 Java 使用的 asdf-vm、Go 使用的 gvm、Node 使用的 nvm,不同的工具也带来了不小的心智负担。

我在 Windows(WSL)实践中重新评估了 DevContainer,并逐步把常用项目固化成独立开发容器:按需启动、互不污染、可快速重建。

Refer to: Developing inside a Container using Visual Studio Code Remote Development

定义 Define

DevContainer 使用 json 来定义开发容器的行为,最重要的部分就是

  • Image:容器的基础镜像 containers.dev: Templates

  • 官方提供了很多主流语言、工具的基础镜像

  • 也可以自己构建(需要安装 vs_server 用于通信)

  • Feature:需要在镜像中执行的脚本、安装的工具 containers.dev: Features

  • 官方 Spec 定义了一个 Feature 需要的参数接口,可以很容易的扩展自己的安装脚本

  • 可作为 OCI 产物一起存到镜像仓库里

构建 & 启动 Build & Start

你可以使用 VSCode 的 Command: Create Dev Container 来配置并创建一个开发容器。或者你提前写好了配置文件并放到了对应的路径(.devcontainer/devcontainer.json),打开项目时 VSCode 会自动获取配置信息并提示你是否要 Reopen in Dev Container。

确定之后,DevContainer(的 CLI)工具会构建一个新的镜像并启动对应的容器。你可以按你的使用习惯,按语言、前后端、项目来划分和构建不同的镜像和容器,容器间互不影响。即使创建之后发现容器中缺少某些工具,你仍可以通过修改配置文件然后 reload,或者是直接在容器中安装。

如果开发时需要一些数据库、中间件,你可以使用 docker-compose 来运行一整套环境。
> Create a development container using Visual Studio Code Remote Development

连接 Connect

随后,VSCode 会通过 DevContainer 插件和安装在容器中的 server 进行连接,这时你就可以编辑容器中的文件了。你既可以将本机的代码通过 volume mount 到容器中,也可以直接在容器中 git clone。

(MacOS 和 Windows 上的 Docker 运行时是运行在虚拟机中的,所以 mount 会产生性能问题,建议直接在容器中 clone
(但缺点就是宿主机上的其他程序就没法编辑这些文件了

"Enjoy your Dev Environments"

Tips

  • 可以通过 devcontainers.json 甚至 docker export 将开发环境分发给其他人,快速实现团队统一

  • Github Codespaces 可以直接使用 devcontainers.json 配置,有条件的可以直接上云了

  • 在开发容器中安装的插件只会关联到这个容器,可以避免大量插件出现的冲突

  • 叠加 Profile 使用,还可以分离快捷键和 VSCode 配置 (当然必要性不是很高)

  • 可以同时启动多个开发容器

  • 一个开发容器中也可以创建多个项目

  • 通过 Command Palette 创建一个开发容器 或者 创建一个 starter 项目,配置好 json 文件后 Reopen in Container

  • 进入容器后,通过 mkdir 或 git clone 创建新的项目目录
  • 使用 Open Folder 打开新的项目目录
  • 之后就可以通过 Open Recent 直接进入容器中的项目

结尾

从想象力和技术力上来看,VSCode 确实比 Jetbrains 强太多了,或者是 Microsoft/Github 太强了。加上 Copilot / ChatGPT(不久的将来)加持,VSCode 成为宇宙第一 IDE 已经是板上钉钉的事情了。大厂也可以基于这样的技术实现 Remote Coding,在提升开发体验的同时保障数据资产,并且成本可能还更低一些。