跳转至

在 Docker 中运行进行开发

本页面介绍了在 Docker 中运行 ZJUI-Learn 的过程,但使用本地安装的 ZJUI-Learn 源代码版本。这是进行 ZJUI-Learn 开发的推荐方法。此功能已在 macOS、Linux 和 Windows 上经过测试并受支持。使用 Windows 时,您需要在 WSL 2 容器内执行以下步骤,并将所有代码和课程文件存储在本机 WSL 2 文件系统中(即不在 /mnt 目录内)。使用 Windows 文件系统或在没有 WSL 的情况下运行 Docker 容器可能会导致性能问题和功能不一致。

!!! tip “概括”

```sh
git clone https://github.com/PrairieLearn/PrairieLearn.git
cd ZJUI-Learn
docker run -it --rm -p 3000:3000 \
  -e DEV=true -v .:/PrairieLearn \
  prairielearn/prairielearn \
  /bin/bash -c "make deps && /PrairieLearn/scripts/init.sh"
```

首先按照安装文档中的描述安装ZJUI-Learn的Docker版本。

然后,从主存储库克隆 ZJUI-Learn:

git clone https://github.com/PrairieLearn/PrairieLearn.git

要运行而不在容器中生成 shell,请运行:

docker run -it --rm -p 3000:3000 \
  -e DEV=true -v .:/PrairieLearn \
  prairielearn/prairielearn \
  /bin/bash -c "make deps && /PrairieLearn/scripts/init.sh"

对于大多数开发,您需要访问容器中的 shell 来运行测试、linting 等。 首先,在容器中启动一个 shell:

cd ZJUI-Learn
docker run -it --rm -p 3000:3000 \
  -w /PrairieLearn -v .:/PrairieLearn \
  prairielearn/prairielearn /bin/bash

这将在运行 ZJUI-Learn 映像的 Docker 容器内启动一个 shell,但使用其代码的当前工作目录。如果您希望从存储库根目录以外的位置运行该命令,请将 . 替换为 .:/ZJUI-Learn 中目录的路径。

要在开发模式下运行 ZJUI-Learn 服务器,请使用:

make deps
make dev

这将启动 ZJUI-Learn 服务器,并在您更改 JavaScript 代码时自动重新启动它。要停止服务器,请按 Ctrl+C。要在服务器停止后退出容器,请按 Ctrl+D

要支持本地开发中的工作区,请使用 make dev-allmake start-all 运行 ZJUI-Learn 和工作区服务器应用程序。为了使这些功能发挥作用,您需要修改 Docker 调用以支持外部评分器和工作区。更多信息请参见讲师安装页面

发展

有关开发过程中常用命令和操作的更多信息,请参阅开发快速入门 页面。

更新或构建 Docker 镜像

上述命令均使用 prairielearn/prairielearn 映像内的本地源运行 ZJUI-Learn。该映像已安装 Python 包和其他支持文件。应定期更新:

docker pull prairielearn/prairielearn

您还可以构建此映像的本地副本,并使用它来确保您拥有与本地源完全对应的版本:

cd /path/to/PrairieLearn
docker build -t prairielearn/prairielearn .

连接到现有的 Docker 容器

以前的 shell 是在自己的容器中启动的。如果您想在_已经运行_的 Docker 容器中打开 shell,您可以找到容器的名称并连接到它。

  • 通过运行查找正在运行的 ZJUI-Learn 容器的名称

    docker ps
    

    这将输出有关正在运行的容器(s)的多列信息。查找 prairielearn/prairielearn 映像并复制其相应的名称。例如,此 docker ps 输出中的 ZJUI-Learn 容器的名称为 upbeat_roentgen

    CONTAINER ID  IMAGE                      COMMAND              CREATED      STATUS      PORTS                   NAMES
    e0f522f41ea4  prairielearn/prairielearn  "/bin/sh -c /Prai…"  2 hours ago  Up 2 hours  0.0.0.0:3000->3000/tcp  upbeat_roentgen
    
  • 通过运行以下命令在 ZJUI-Learn 容器中打开 shell

    docker exec -it CONTAINER_NAME /bin/bash