跳至主要内容

重建代码空间中的容器

您可以重建正在使用的代码空间的开发容器以应用配置更改。有时,您可能希望执行完全重建。

关于重建开发容器

在代码空间中工作时,您的开发环境是一个在虚拟机上运行的 Docker 容器。如果您在代码空间中对开发容器配置进行了更改,并且希望将这些更改应用于当前代码空间,则需要重建容器。

默认情况下,当您重建开发容器时,GitHub 代码空间将通过重用容器先前构建的缓存图像来加快构建过程。这通常是实现开发容器配置更改的最快方法,原因如下。

  • GitHub 代码空间可以重用缓存中的图像,而不是从容器注册表中重新拉取它们。
  • 定义容器构建方式的开发容器配置部分,例如开发容器功能和 Dockerfile 指令,可能已经在缓存的镜像层中实现,因此您无需等待这些进程再次运行。(但是,您配置中在容器构建后运行的命令,例如 onCreateCommand,将再次运行。)

有时,您可能希望对容器进行完全重建。在完全重建中,GitHub Codespaces 会清理缓存中的所有 Docker 容器、镜像和卷,然后使用新拉取的镜像重建您的容器。您配置中定义的所有设置将再次运行,生成新的镜像层。在对容器进行多次迭代重建并使用缓存的镜像后,您可能希望执行完全重建,例如在以下情况下。

  • 您希望确保配置中定义的设置不依赖于缓存的镜像,并且在有人根据配置创建新的 codespace 时,将按要求运行。例如,自上次将依赖项拉取到您的 codespace 以来,该依赖项可能已从基础镜像中删除。
  • 您希望释放缓存使用的磁盘空间,例如,如果您磁盘空间不足或希望最小化存储费用。如果您多次更改了基础镜像,对配置进行了大量迭代更改,或者使用 Docker Compose 运行多个容器,则您的镜像缓存可能会使用大量的磁盘空间。

重建容器

您可以在 VS Code Web 客户端或桌面应用程序中重建 codespace 中的容器,也可以使用 GitHub CLI。

在 VS Code Web 客户端或桌面应用程序中重建开发容器

  1. 使用 Shift+Command+P(Mac)或 Ctrl+Shift+P(Windows/Linux)访问 VS Code 命令面板。

  2. 开始键入“Rebuild”,然后选择 **Codespaces: Rebuild Container** 或 **Codespaces: Full Rebuild Container**。

    Screenshot of the "Codespaces: Full Rebuild Container" option in the Command Palette.

  3. 如果开发容器配置的更改导致容器错误,您的 codespace 将在恢复模式下运行,您将看到错误消息。

    Screenshot of a message saying that the codespace is running in recovery mode. Below the message are buttons labeled "Cancel" and "View creation log."

    • 要通过查看创建日志来诊断错误,请单击 **View creation log**。
    • 要修复日志中识别的错误,请更新您的 devcontainer.json 文件。
    • 要应用更改,请重建您的容器。

使用 GitHub CLI 重建开发容器

如果您在 VS Code 之外(例如在 GitHub.com 或 JetBrains IDE 中)更改了开发容器配置,则可以使用 GitHub CLI 为现有代码空间重建开发容器。

  1. 在终端中,输入以下命令。

    gh codespace rebuild
    

    您的代码空间将列出。

  2. 使用键盘上的箭头键突出显示所需的代码空间,然后按 Enter

要使用 GitHub CLI 执行完整重建,可以使用 gh codespace rebuild --full 命令。

在重建中保留数据

创建代码空间时,您的仓库会被克隆到代码空间中的 /workspaces 目录。这是一个持久目录,它被挂载到容器中。您在此目录中进行的任何更改,包括编辑、添加或删除文件,都会在您停止和启动代码空间以及在代码空间中重建容器时保留。

/workspaces 目录之外,您的代码空间包含一个 Linux 目录结构,该结构根据用于构建代码空间的开发容器映像而有所不同。您可以在 /workspaces 目录之外添加文件或更改文件:例如,您可以安装新程序,或者您可以在文件中设置 shell 配置,例如 ~/.bashrc。作为非 root 用户,您可能不会自动拥有对某些目录的写入权限,但大多数映像允许使用 sudo 命令对这些目录进行 root 访问。

/workspaces 之外,除了 /tmp 目录之外,代码空间中的目录与容器的生命周期绑定。这意味着您所做的任何更改都会在您停止和启动代码空间时保留,但在您重建容器时不会保留。

如果您想在重建时保留 /workspaces 目录之外的文件,您可以在容器中所需的位置创建一个指向持久目录的符号链接(symlink)。例如,在您的 /workspaces/.devcontainer 目录中,您可以创建一个 config 目录,该目录将在重建中保留。然后,您可以将 config 目录及其内容作为 devcontainer.json 文件中的 postCreateCommand 进行符号链接。

{
    "image": "mcr.microsoft.com/devcontainers/base:alpine",
    "postCreateCommand": ".devcontainer/postCreate.sh"
}

在下面的示例 postCreate.sh 文件中,config 目录的内容被符号链接到主目录。

#!/bin/bash
ln -sf $PWD/.devcontainer/config $HOME/config && set +x

进一步阅读