我目前正在构建一个基于 VS Code DevContainers 的开发环境。为了构建软件的所有配置,我需要大约 50GB 的工具依赖项。这本身并不是问题,因为使用 Docker 启动大型镜像的开销非常小。然而,我们的软件的不同版本需要不同的依赖项,导致许多大图像快速占用所有磁盘空间。
我怎样才能有效地将依赖项分发给所有开发人员?就我而言,大多数开发人员对管理依赖项缺乏经验或兴趣。理想情况下,依赖关系由某种工具自动管理。
操作系统是Linux(WSL2)。我们的构建系统目前只是一个大型 Python 项目(100k+ LOC),它根据参数构建所有内容。编译器和其他工具都是通过环境变量定义的。
我最初的想法是创建一个可以运行Python构建环境的小型DevContainer。然后我在工具的所有系统调用前面添加了
docker exec ... container sh -c '<original call>'
。在运行任何命令之前,我会拉取映像并使用相应的工具运行容器。即使在我们的 CI/CD 环境中,这种方法的效果也出奇的好,只需对我们的大型代码库进行很少的修改。然而,它很慢。构建时间翻倍,从 4 分钟增加到 8 分钟。
VScode DevContainers 可以有 mounts,因此可以将本地文件夹从主机链接到 DevContainer。因此,您的主机系统上就有 50GB 的依赖项。
devcontainer.json
示例
...
"mounts": [
"source=MyDependencies,target=/{{My folder for the dependencies inside the devContainer}},type=volume"
]
...
创建
.devcontainer/devcontainer.json
和 .devcontainer/Dockerfile
在 devcontaoner.json 添加
...
{
"build": {
"dockerfile": "Dockerfile",
"args": { }
}
}
...
在 Dockerfile 中定义您自己的基础映像
FROM
您可以在 DevContainer 基础映像上使用 https://containers.dev/implementors/reference/#labels 或创建自定义 Docker 映像。