如果我理解正确,您使用 "Clone Repository in Container Volume..." 选项将存储库直接克隆到容器卷中。 选项。
假设本地卷仍然存在,您应该仍然能够恢复保存在其中的未提交更改。
首先确保该卷仍然存在:除非您特别命名它,否则它通常命名为 -。使用此 docker 命令列出卷及其标签:
docker volume ls --format "{{.Name}}:\t{{.Labels}}"
注意我包含了 Labels 属性,这应该可以帮助您找到正确的卷,该卷的标签应该类似于 vsch.local.repository=。如果您记得最初用于克隆的确切 URL,您甚至可以使用上一个命令的过滤模式,如下所示:
docker volume ls --filter label=vsch.local.repository=<your-repository-clone-url>
如果您仍然难以找到确切的卷,您可以在Official docker documentation 中找到有关 docker volume ls 命令的更多信息,也可以使用 docker volume inspect 来获取有关卷的详细信息。
一旦您知道卷的名称,请在本地计算机上打开一个空文件夹并创建必要的 devcontainer 文件 .devcontainer/devcontainer.json。选择最适合您的开发环境的镜像,但是为了通过执行简单的 git commit 恢复您的工作,任何安装了 git 的镜像都应该这样做(即使是那些不是专门设计为开发容器的镜像,在这里我正在使用 Alpine,因为它占用的空间相对较小)。
然后设置 workspaceFolder 和 workspaceMount 变量以将卷挂载到新的开发容器中,如下所示:
{
"image": "mcr.microsoft.com/vscode/devcontainers/base:0-alpine-3.13",
"workspaceFolder": "/workspaces/<your-repository-name>",
"workspaceMount": "type=volume,source=<your-volume-name>,target=/worskpaces"
}
如果您需要更具体的内容,可以在 devcontainer.json reference page 中找到有关可能的 devcontainer 配置的详尽文档。
您现在可以使用 VSCode git 工具,甚至可以从上次“持久化”文件内容时离开的位置继续工作。
顺便说一句,如果您通过 TCP 或 SSH 使用带有非本地上下文的 Docker(也就是 docker VM 未在您的本地计算机上运行),那么这是我所知道的使用 VSCode 开发容器的唯一方法,因为您的本地文件系统不能直接用于 docker 机器。
如果您查看当您要求 VSCode 为您启动 devcontainer 时生成的容器日志,您会发现 IDE 执行的实际 docker run 命令类似于以下内容:
docker run ... type=bind,source=<your-local-folder>,target=/workspaces/<your-local-folder-or-workspace-basename>,consistency=cached ...
意味着如果你在 devcontainer.json 中省略指定 workspaceMount 变量,VSCode 实际上会像你这样写:
// file: .devcontainer/devcontainer.json
{
// ...
"workspaceFolder": "/worspaces/${localWorkspaceFolderBasename}",
"workspaceMount": "type=bind,source=${localWorkspaceFolder},target=/worspaces/${localWorkspaceFolderBasename},consistency=cached"}
// ...
}
其中 ${localWorkspaceFolder} 和 ${localWorkspaceFolderBasename} 是 VSCode devcontainer.json 上下文中可用的动态变量。
或者
如果您只是想提交更改并在之后丢弃卷,您可以简单地启动一个安装了 git 的 docker 容器(即使是小型 Alpine linux 也应该这样做):
docker run --rm -it --name repo-recovery --mount type=volume,source=<your-volume-name>,target=/workspaces --workdir /workspaces/<your-repository-name> mcr.microsoft.com/vscode/devcontainers/base:0-alpine-3.13 /bin/bash
然后,如果你熟悉 git 命令行工具,你可以 git add 和 git commit 你所有的修改。或者,您可以直接运行 git 命令,而不是手动使用容器内的 shell:
docker run --rm -t --name repo-recovery --mount type=volume,source=<your-volume-name>,target=/workspaces --workdir /workspaces/<your-repository-name> mcr.microsoft.com/vscode/devcontainers/base:0-alpine-3.13 /bin/bash -c "git add . && git commit -m 'Recovered from devcontainer'"
您可以在VSCode devcontainers repository 中找到 MS 提供的开发容器的完整列表。
Devcontainers 是一个了不起的工具,可以帮助您保持环境清洁和灵活,我希望这个答案能够理解并帮助您解决问题并扩展您对该工具的了解。
干杯