关于重建开发容器
在代码空间中工作时,您的开发环境是一个在虚拟机上运行的 Docker 容器。如果您在代码空间中对开发容器配置进行了更改,并且希望将这些更改应用于当前代码空间,则需要重建容器。
默认情况下,当您重建开发容器时,GitHub 代码空间将通过重用容器先前构建的缓存图像来加快构建过程。这通常是实现开发容器配置更改的最快方法,原因如下。
- GitHub 代码空间可以重用缓存中的图像,而不是从容器注册表中重新拉取它们。
- 定义容器构建方式的开发容器配置部分,例如开发容器功能和 Dockerfile 指令,可能已经在缓存的镜像层中实现,因此您无需等待这些进程再次运行。(但是,您配置中在容器构建后运行的命令,例如
onCreateCommand
,将再次运行。)
有时,您可能希望对容器进行完全重建。在完全重建中,GitHub Codespaces 会清理缓存中的所有 Docker 容器、镜像和卷,然后使用新拉取的镜像重建您的容器。您配置中定义的所有设置将再次运行,生成新的镜像层。在对容器进行多次迭代重建并使用缓存的镜像后,您可能希望执行完全重建,例如在以下情况下。
- 您希望确保配置中定义的设置不依赖于缓存的镜像,并且在有人根据配置创建新的 codespace 时,将按要求运行。例如,自上次将依赖项拉取到您的 codespace 以来,该依赖项可能已从基础镜像中删除。
- 您希望释放缓存使用的磁盘空间,例如,如果您磁盘空间不足或希望最小化存储费用。如果您多次更改了基础镜像,对配置进行了大量迭代更改,或者使用 Docker Compose 运行多个容器,则您的镜像缓存可能会使用大量的磁盘空间。
重建容器
您可以在 VS Code Web 客户端或桌面应用程序中重建 codespace 中的容器,也可以使用 GitHub CLI。
在 VS Code Web 客户端或桌面应用程序中重建开发容器
-
使用 Shift+Command+P(Mac)或 Ctrl+Shift+P(Windows/Linux)访问 VS Code 命令面板。
-
开始键入“Rebuild”,然后选择 **Codespaces: Rebuild Container** 或 **Codespaces: Full Rebuild Container**。
-
如果开发容器配置的更改导致容器错误,您的 codespace 将在恢复模式下运行,您将看到错误消息。
- 要通过查看创建日志来诊断错误,请单击 **View creation log**。
- 要修复日志中识别的错误,请更新您的
devcontainer.json
文件。 - 要应用更改,请重建您的容器。
使用 GitHub CLI 重建开发容器
如果您在 VS Code 之外(例如在 GitHub.com 或 JetBrains IDE 中)更改了开发容器配置,则可以使用 GitHub CLI 为现有代码空间重建开发容器。
-
在终端中,输入以下命令。
gh codespace rebuild
您的代码空间将列出。
-
使用键盘上的箭头键突出显示所需的代码空间,然后按 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
进一步阅读
- "开发容器简介"