跳转至

Docker 镜像

ZJUI-Learn 依靠 Docker 容器为学生作业和评分提供隔离环境。这些容器允许学生提交的内容(例如编码和脚本)在可以访问有限数据集的环境中执行,并且不会干扰其他学生、课程数据或 ZJUI-Learn 功能。 ZJUI-Learn 目前使用两种类型的容器:外部评分者,用于对学生提交的内容进行评分;工作区,允许学生与引导式用户界面进行交互。

Docker 容器是从容器映像 创建的,这些映像是标准化包,其中包括运行容器所需的所有文件、二进制文件、库和配置。 ZJUI-Learn 提供并维护一组默认镜像,无需额外配置即可使用:

鼓励教师使用维护的图像之一,以确保可以在您的问题中访问所有安全更新和新功能。不过,问题可以使用自己的图像,前提是这些图像允许问题配置提供外部评分和工作区所需的适当功能。

维护图像的自定义变体

有些问题可能需要对现有映像进行额外的自定义,例如安装操作系统依赖项、Python 包或配置操作系统级别设置。在这种情况下,教师可以根据现有图像创建自定义图像。这可以通过以下步骤来完成:

  1. 在您的环境中安装Docker Desktop
  2. 如果您还没有 Docker Hub 帐户,请创建一个。

    此步骤应由与相关课程保持长期关联的用户完成,例如永久教职人员或支持人员,而不是助教或实习讲师。如果有必要,这将简化未来对自定义映像的更新。如果希望多个用户获得推送这些镜像的权限,您可以考虑使用 访问令牌团队

  3. 创建一个新目录来保存图像的信息。如果您希望与课程中的其他工作人员共享,您可以在课程存储库中创建它。

  4. 在上面的目录中,创建一个名为 Dockerfile(不带扩展名)的文件,并将其内容设置为要用于您正在创建的映像的指令集。例如,要使用 datascience Python 包创建 prairielearn/workspace-vscode-python 的自定义版本,该文件可能如下所示:

    FROM prairielearn/workspace-vscode-python
    RUN uv pip install datascience
    
  5. 在终端中,切换到包含上述 Dockerfile 的目录并构建新映像(将 yourdockerhubaccount 替换为您的 Docker Hub 帐户名称,将 yourimagename 替换为您选择的映像名称):

    docker build --platform linux/amd64 -t yourdockerhubaccount/yourimagename .
    

    请注意,ZJUI-Learn 使用的生产环境需要 linux/amd64 镜像平台。因此,有必要使用此平台构建映像,如上面命令中的 --platform 参数中所列。这对于基于 ARM 架构(例如 Apple Silicon 或 Windows on Arm 系统)的用户尤其重要,因为这些系统默认为 linux/arm64

  6. 构建过程完成后,将映像推送到 Docker Hub 注册表(再次根据需要替换 yourdockerhubaccountyourimagename):

    docker push yourdockerhubaccount/yourimagename
    
  7. 将需要自定义图像的问题的设置更改为使用您上面设置的图像名称。

  8. 在课程的“同步”页面的“Docker 映像”下,找到上面的映像名称,然后单击“同步”。

请注意,如果原始图像发生更改或附加功能,上述过程_不会_导致上面的图像自动更新。您有责任通过重复上述步骤 5-8 定期更新您的自定义映像。

在本地测试自定义图像

对于仅包含一两个额外包或库的简单自定义映像,按照上述步骤并在生产中测试映像可能足以确保其按预期工作。同样,更新包版本等简单更改可以通过更新上述步骤 4 中的文件,然后重新运行步骤 5-8 来实现。

但是,对于更复杂的映像或更复杂的现有自定义映像更改,建议在将映像推送到生产环境之前在本地 ZJUI-Learn 环境 中测试映像。在这种情况下,重要的是要确保映像的更新版本仅限于本地环境,并且在测试完成之前不会使用新映像版本更新生产环境。虽然避免图像同步(上面的步骤 8)通常足以防止这种情况,但在实践中可能很难确保这一点,特别是在多个用户正在处理同一课程的情况下。

默认情况下,ZJUI-Learn 的本地安装将在每次使用时提取最新版本的分级机/工作区映像。但是,可以更改 ZJUI-Learn 的配置以使用映像的本地版本。这可以通过在您选择的任何目录中创建包含以下内容的 config.json 文件来完成:

config.json
{
  "externalGradingPullImagesFromDockerHub": false,
  "workspacePullImagesFromDockerHub": false
}

然后,在运行ZJUI-Learn时映射此配置文件:

docker run -it --rm -p 3000:3000 \
  -v "/path/to/config.json:/PrairieLearn/config.json" `# Replace the path with your config.json directory` \
  `# Include all other options here...` \
  prairielearn/prairielearn

Note

通过上述配置,本地 ZJUI-Learn 环境将在需要时使用任何分级机或工作区图像的本地版本。这意味着您有责任通过为您正在使用的任何图像(包括提供的图像和自定义图像)调用 docker pull IMAGENAME 来确保您使用的任何图像的本地版本是最新的。

!!! note “在 macOS 上进行本机测试”

配置参考中有一个关于[在 macOS 上本机运行工作区/外部评分器](./dev-guide/configJson.md#running-workspaces-external-graders-natively-on-macos) 的部分。如果不这样做,您将遇到权限错误。这不适用于通过 Docker 运行 ZJUI-Learn 的用户。

设置上述配置后,您可以修改 Dockerfile 和相关文件,然后运行上面列表中的步骤 5。然后,您可以测试使用自定义图像的问题,以确保它们按预期工作。一旦您对问题按预期运行感到满意,请继续执行上述步骤 6-8。如果您对问题进行了任何更改以适应图像中的更改,请确保您的问题也与生产环境正确同步。