跳到主要内容

在 Codespace 中重建容器

您可以重建正在使用的 Codespace 的开发容器以应用配置更改。有时,您可能需要执行完全重建。

关于重建开发容器

在 Codespace 中工作时,您的开发环境是在虚拟机上运行的 Docker 容器。如果您在 Codespace 中更改开发容器配置,并且想要将这些更改应用于当前 Codespace,则需要重建容器。

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

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

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

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

重建容器

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

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

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

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

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

  3. 在打开的确认对话框中选择RebuildFull Rebuild

  4. 如果开发容器配置的更改导致容器错误,您的 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 或 JetBrains IDE 中),您可以使用 GitHub CLI 为现有的 Codespace 重建开发容器。

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

    gh codespace rebuild
    

    您的 Codespaces 将列出。

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

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

在重建过程中保留数据

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

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

/workspaces目录之外,除了/tmp目录外,Codespace 中的目录都与容器的生命周期相关联。这意味着您进行的任何更改在您停止和启动 Codespace 时都会保留,但在重建容器时不会保留。

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

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

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

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

进一步阅读