首页 > 解决方案 > Docker 中的 Docker on Continuous Integration 导致“设备上没有剩余空间”

问题描述

在我当前的项目中,我们使用 Jenkins 和基于 Docker-In-Docker 的方法来构建 docker 镜像。

我使用 docker-compose 和 Landoops 命令行测试工具 coyote 扩展了我们的一项工作以使用集成测试。我确实在构建中构建了生产 docker 镜像以及仅用于集成测试的 docker 镜像。

一段时间后(我认为/var/lib/docker)下的docker空间填满了整个磁盘,我得到了这样的东西:

mkdir /var/lib/docker/volumes/41d787304856fb065aa0d6342efe0a0c38672775fc044a3345ae5067ec8b8f3c: no space left on device

当我在清理卷的同时进行 docker 系统修剪时,构建/测试会再次运行,但必须再次下载大量 docker 镜像,并且在另一个测试正在下载/构建 docker 镜像的过程中不应该这样做。

所以我的结论是:Docker-In-Docker(尤其是本地镜像仓库和卷存储)正在使用“外部”Docker 注册表和卷存储。

我的问题是:在不删除每个作业之后/之前的所有图像/卷的情况下,是否有解决这个问题的方法?

更新

我确实发现了这个

“Device Mapper 没有命名空间,因此如果 Docker 的多个实例在同一台机器上使用它,它们都将能够看到(并影响)彼此的映像和容器支持设备。没有。对于许多这些问题都有解决方法; 例如,如果你想在内部 Docker 中使用 AUFS,只需将 /var/lib/docker 提升为一个卷就可以了。Docker 为 Device Mapper 目标名称添加了一些基本的命名空间,这样如果多次调用Docker 在同一台机器上运行,它们不会互相踩踏。”

来自:https ://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

所以在我看来,我们的 OPS 团队只是在不使用 devicemapper 命名空间的情况下挂载了它,因此同一节点上的每个作业都使用相同的 /var/lib/docker。

标签: dockerdocker-composedocker-in-docker

解决方案


推荐阅读