🚀 在 VS Code 中

教育中的开发容器:面向教师的指南

2020 年 7 月 27 日,Brigit Murtaugh 发布,@BrigitMurtaugh

我们从许多教育工作者那里了解到,学期的最初几天或几周可能会因为为学生配置正确的环境而浪费掉。即便如此,学生最终可能仍然会获得低质量的开发体验,或者他们的作业评分不足

“通常为我的学生设置环境需要五个课时。需要处理 Python 版本问题。其中有很多复杂性。可悲的是,这种复杂性需要花费大量时间和金钱来解决。” -[美国社区大学 CS 101 教授]

“我更喜欢一个专门为 Python 安装设置的 VS Code 版本……” -[文理学院助理教授]

使用 Visual Studio Code 的开发容器可以作为教育领域的绝佳工具,以确保学生拥有一致的编码环境。它们负责设置,以便学生和教师可以快速跳过配置,转而专注于真正重要的事情:学习和编写出色的代码!

开发容器

那么,什么是开发容器?容器是软件包代码以及代码运行所需的所有依赖项(包括运行时、工具、库和设置)的软件片段。容器最初是作为一种在一致的环境中部署和管理应用程序并更有效地利用硬件的方式而创建的。后来,它们发展为帮助提供一致的构建环境,而最近,又发展为开发环境。这就是 dev container 名称的由来。

当您创建容器时,其初始内容来自所谓的“镜像”。可以将镜像视为一个迷你磁盘驱动器,其中预装了操作系统和其他工具。您可以使用 Dockerfile 描述镜像中的内容,一旦运行镜像,它就会变成一个容器。

Dev container 提供与计算机独立的编码环境。例如,如果您下载特定版本的依赖项,则该版本将是容器独有的。在下图中,请注意容器如何包含应用程序及其必要的依赖项,从而使计算机(主机操作系统和基础架构)免受任何依赖项的干扰并保持清洁

Containers diagram

作为教师,您可以为作业创建特定的镜像。每个学生都将获得完全相同版本的依赖项,例如相同版本的 Python 或 C++ 编译器,而与其操作系统或计算机上已安装的任何其他文件无关。

VS Code 中的开发容器

Visual Studio Code Dev Containers 扩展允许您使用容器作为您的主要编码环境。在课堂上,教师可以采用现有的 dev container,或创建自己的容器,并将其与班级分享。每个学生都可以在 VS Code 中打开容器,并自动拥有开发应用程序所需的工具和运行时。学生还可以访问 VS Code 的完整功能集,包括 IntelliSense 和调试。

Dev Containers 扩展仅适用于基于 Linux 的容器,因此,尽管学生的计算机上可能安装了不同的操作系统,但编码环境在所有计算机上都将保持一致。

我们已经看到教师在课堂上成功使用 Dev Containers。您可以查看使用 DevContainers 标准化学生开发环境:经验报告,以了解三位研究人员在加州大学圣地亚哥分校的课程中使用 dev container 的经验。

这篇文章将作为指导,帮助希望在课堂上实施开发容器的教师为学生创建更流畅、更一致的环境。

要亲眼目睹 dev container 的实际应用以及学生如何在短短 5 分钟内入门,请观看我们的学生入门介绍视频

面向教师的指南

使用传统的设置方法,学生在设置环境时可能会遇到各种各样的问题。一些示例包括他们独特的操作系统、项目文件的存储位置,或者他们安装的运行时或工具中的细微差异。教师需要精通所有这些细微之处,才能帮助学生解决这些问题。

一个常见的问题是管理工具的不同版本。以 Python 为例:有 Python 2 和 Python 3,以及不同的次要版本。拥有多个 Python 版本,以及多个随附的工具(如 linters),可能会让人感到困惑并导致错误。

为了节省大量时间和避免困惑,我们可以使用 dev container 为我们的班级创建一个标准化的 Python 开发环境。学生都将获得相同版本的 Python,避免了安装新版本或卸载任何旧版本的需要,并且每个人运行相同的容器和源代码都将获得完全相同的结果。

先决条件

  • 安装 Visual Studio Code
  • 安装 Docker Desktop。
    • Docker 是构建和共享容器的行业标准。我们推荐使用 Docker Desktop Stable 2.3.0.3,因为它是最新且性能最高的 Docker Desktop 版本。
    • 新推出了Windows Home 上的 Docker Desktop 支持。它需要 Windows 10 版本 2004 并启用 Windows Subsystem for Linux 2 (WSL 2) 后端。按照WSL 2 安装指南启用 WSL 2。
    • 对于不想配置 WSL 2 后端的学生,Windows 10 Pro、企业版或教育版(Build 16299 或更高版本)可以替代使用适用于 Windows 的 Docker Desktop,并且必须启用 Hyper-V 和容器 Windows 功能。

让我们从启动 VS Code 开始,我们可以通过在命令提示符或终端中键入 code(或者只是在计算机上选择 VS Code)来完成此操作

Launch VS Code from command prompt

VS Code 启动后,请确保您已安装 Dev Containers 扩展

Dev Containers extension

当我们安装任何 Remote 扩展时,绿色的 Remote 指示器会添加到状态栏的左下方

Remote indicator in VS Code

您可以单击它以打开命令面板并验证是否列出了 Dev Containers 命令

List of remote commands in Command Palette

访问课堂容器

让我们演练一个示例 dev container,以帮助学生获得一致的编码环境。在我们的课堂中,我们可以创建一个 GitHub 存储库来存储共享相同技术堆栈的练习。例如,所有 Python 作业都可以使用相同的容器并存储在同一个存储库中。

我们有一个示例 vscode-course-sample GitHub 存储库,其中包含一个 Python dev container 和两个 Python 入门作业。让我们在 VS Code 中打开它。

您可以选择左下角的 Remote 指示器,或使用命令面板调出 Dev Containers 命令。

让我们调用在容器卷中克隆仓库...

Clone Repository in Container Volume

我们需要输入存储容器的 GitHub 仓库的 URL,在本例中是 microsoft/vscode-course-sample

Paste GitHub URL in Command Palette

您可以创建唯一的卷。卷是文件将存储在我们容器中的位置

Volume options in Command Palette

现在我们已经选择了容器仓库,VS Code 重新加载以构建镜像并启动容器

Close-up on starting container notification

容器构建并运行后,我们的文件将被加载,我们就可以在我们的 Python 环境中开始编码了!

单击资源管理器中的 sort.py 以打开它,然后按 F5(或右上角的绿色运行图标)来运行它

Run sort.py program

我们的 Python 代码成功运行,而无需在本地计算机上设置 Python。

我们还可以访问 VS Code 的所有优点,例如设置断点以暂停我们的程序并帮助我们调试。让我们在对单词列表进行排序时设置一个断点。

Setting a breakpoint

我们可以使用 F5 运行我们的程序。请注意,程序在到达断点后会停止

Program stops at breakpoint

为您的班级创建容器

现在我们已经看到了一个出色的容器示例,让我们使用 Dev Containers 扩展自己设置我们的第一个容器。让我们从“Hello World”Python 应用程序开始

Hello world Python app

我们将选择 Dev Containers: 添加 Dev Container 配置文件… 以开始设置开发容器所需的文件

Add Dev Container Configuration Files command

容器配置文件是创建和自定义开发容器所必需的。出现的容器定义列表是根据您的应用程序的内容进行过滤的,在本例中是一个 Python 文件。让我们选择 Python 3

Select Python 3 config file in Command Palette

Dev Containers 扩展会自动添加一个 .devcontainer 文件夹和两个配置文件:devcontainer.json 和 Dockerfile。让我们仔细看看这两个文件。

devcontainer.json

devcontainer.json 描述了 VS Code 应如何启动我们的容器以及连接后应执行的操作。此文件可以位于 .devcontainer/devcontainer.json 下,也可以直接作为 devcontainer.json 存储在项目的根目录中。

这是一个简单的 devcontainer.json 示例。它拉取一个预配置的 Node 镜像,自动为端口 3000 设置端口转发,并在创建容器时安装 eslint 扩展

Simple Node devcontainer.json

这是一个稍微更详细的 devcontainer.json 示例,用于我们的 Python 项目。它使用 dockerfile 属性引用 Dockerfile,而不是直接引用镜像。它还自动安装 Python 扩展,并在创建容器后建立一组特定于容器的设置,例如 linting

More detailed Python devcontainer.json

devcontainer.json 是一个绝佳的机会,可以创建自定义的编码环境,以满足您的学生的特定需求。您可以指定几个变量来为每个班级或作业创建独特的环境。

我们建议在教育领域的 devcontainer.json 中首先使用的变量是

属性 类型 描述
image string 容器注册表(即 DockerHub)中镜像的名称,VS Code 应使用该镜像创建 dev container。
dockerFile string 定义容器内容的 Dockerfile 的位置。路径相对于 devcontainer.json 文件。您可以在 vscode-dev-containers 存储库中找到许多不同运行时的示例 Dockerfile。
name string 容器的显示名称。
extensions array 扩展 ID 数组,指定在创建容器时应在容器内安装的扩展。默认为 []
settings object 将默认的 settings.json 值添加到特定于容器/机器的设置文件中。

在此文件中设置一些变量将在长期内为您的班级节省时间。例如,您可以使用 extensions 变量来确保您的所有学生都自动获得相同的扩展集。设置路径也可能具有挑战性或导致学生计算机出现问题,但通过 settings 变量指定路径信息,您将节省班级时间并确保他们计算机的路径变量不会在此过程中受到损害。

devcontainer.json 参考中有表格列出了您可以包含在此配置文件中的所有可用属性。

Dockerfile

Docker 可以通过读取 Dockerfile 中的指令来自动构建镜像。此文件至少应使用 FROM 指定基本镜像,并且还可以包含命令行指令。

这是我们的 Python 应用程序中的 Dockerfile 的外观

Python dockerfile in app

打开容器

添加容器配置文件后,我们收到通知,告知我们的文件夹现在有一个 devcontainer.json 文件。让我们选择 在容器中重新打开

Reopen in container notification

VS Code 的新实例启动,我们的镜像正在构建中,我们的应用程序正在我们的 dev container 中启动

Relaunch VS Code to start dev container

容器构建完成后,我们拥有所有相同的文件,但现在左下角的指示器显示“Dev Container: Python 3”,表示我们位于容器内部。我们可以轻松运行我们的代码,而无需考虑我们的本地机器上安装了哪个版本的 Python(如果有的话)!

Run Python code in dev container

创建和共享作业

现在您已经拥有了一个 dev container,您可以将其上传到存储库,以便您的学生可以访问它来完成他们的作业。您可以将作业说明包含在 README 中,以及作业所需的任何基本代码或模板代码,以及 .devcontainer 文件夹,以便他们都获得一致的开发体验。所有这些文件都可以作为一个存储库上传。

确保您已安装 Git。您可以从 VS Code 中的容器项目初始化一个新的 Git 存储库。或者,您可以从命令行中使用 git init 从项目的目录中执行此操作。

下一步是将您的本地存储库连接到浏览器中 GitHub 上的新存储库

Create a new GitHub repo online

然后,我们将本地 Git 存储库(计算机上的容器项目)连接到远程存储库(我们在浏览器中创建的 GitHub 存储库)

Connect Git repos in command prompt

系统可能会提示您登录 GitHub。登录后,您的文件可以添加到您的远程 Git 存储库

Push remote files in command prompt

现在当我刷新浏览器中的 GitHub 时,我可以查看我的文件了!

View files in GitHub repo in browser online

有关如何将存储库上传到 GitHub 的更多信息,请查看此将现有项目添加到 GitHub 指南

访问作业

要了解学生如何从 GitHub 访问 dev container 并轻松开始编程,请观看我们的5 分钟快速视频

反馈 & 更多资源

为了帮助设置带有容器的 VS Code,我们在 VS Code 远程开发文档中提供了详细的文章。如果您对我们的团队有任何疑问或反馈,请随时在 VS Code 远程开发 GitHub 存储库上提出问题,或在 Twitter 上 @code 上给我们发推文。

祝您编码愉快!

Brigit Murtaugh,VS Code 项目经理 @BrigitMurtaugh