VSCode-Dev-Container 插件使用

学习 docker / kubernetes 的时候我曾经想,既然有专门用于编译的 image base,那么要是能够用 docker 进行编译安装配置的尝试就好了,因为如果直接在系统上进行编译安装,如果尝试多次并且有失败或放弃的情况下,包管理器和系统路径(/usr /etc 等等) 下总是会被污染。当然,由于需要进行编译安装配置,要去最好可以用 vscode 连进容器里面进行操作,这样可以借用 vscode 的插件功能、代码高亮等等便捷功能。

那么该怎么实现这一点呢?询问群友,一个方案是自己制作一个包含 sshd 的镜像,然后手动设置好端口映射、volume,之后用 VSCode-Remote 插件像连一个普通远程 Linux 设备一样连上去。这自然是可以,但是启动起来很麻烦。有没有更简单的方法呢?有群友提出 ”VSCode-Dev-Container 插件就是干这个的,工作上在用“。

VSCode-Dev-Container 插件实际上是 VSCode-Remote 这一官方插件的一个子插件 (?),已经在我电脑里躺了很久了,由于宿主机是 Windows 一直没有能正确触发,我也一直没在意。默认教程 Get started with development Containers in Visual Studio Code 实操需要 Docker Desktop 支持,无法使用。于是查阅了一些资料,主要参考这篇官方blog,在 WSL2 上实现了 Dev-Container 的正常使用。

于是记录一下。理论上 WSL2 可用 普通的远程 Linux 平台也没问题。

使用步骤

  1. 连接到 Linux 服务器

    和默认做法不同,因为宿主机是 Windows 没有 docker ,要使用远程 Linux (这里是 WSL) 上的 docker 。因此需要先连接到 Linux 服务器。

  2. 新建一个文件夹作为 工作目录 workspace

    这个文件夹内的内容会被完整映射到容器中,方便修改。

  3. 确保 docker 正在运行

    WSL2 里面有个特殊情况,它不使用 systemd 管理启动任务,因此安装的 docker 每次开机也不会自己启动。

    可以使用

    1
    sudo service docker start

    启动 docker 。

  4. 创建容器 meta

    这是 Remote 插件的 Open a Remote Window 。点击,选择 Add Dev Container Configuration Files;注意整个过程中都不会用到 New Dev Container 这个选项。

    这时候可以选择想要的开发环境、预装软件包。

    完成后,在 workspace 中会生成

    1
    2
    3
    4
    5
    .
    ├── .devcontainer
    │ └── devcontainer.json
    └── .github
    └── dependabot.yml

    devcontainer.json 中可以设置一些容器属性,例如是否容器内使用 root 等等。详细情况可参考官方教程

  5. 连接到容器

    点击 Remote 插件的 Open a Remote Window ,选择 Reopen in Container

    这是将 workspace 映射到容器内。

    过程会经历 拉取、构建,可能需要不少时间,可以打开日志查看。

  6. 可以使用了!

    容器启动之后就正式可以使用了!

    workspace 的修改就是在 Linux 下的修改,无需同步。在其他文件夹的修改都是在容器内的,不会污染外部。

    VSCode-Remote 插件会自动为打开的调试服务构建 Tunnel,可以在宿主机上直接访问。

    当使用完成后,点击 Remote 插件的 Open a Remote Window ,选择断开连接可以安全退出容器(容器还保存);

  7. 删除容器

    1
    sudo docker ps -a

    查找到对应容器,

    1
    sudo docker rm <id>

    删除。

Author: DWCarrot
Link: https://dwcarrot.github.io/blog/2024/05/02/VSCode-Dev-Containers/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.