docker - 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。
解决方案
推荐阅读
- xamarin - 我的 xamarin 项目中没有 AD-Hoc 选项
- neo4j - 如何取消 neo4j 密码交易
- html - 我的 html 链接只能在新标签页中打开?
- mysql - 错误 2027 (HY000):格式错误的数据包 - 登录期间
- r - 在 blogdown 中找不到 hugo 主题目录
- javascript - 在将返回数据用于另一个函数调用之前,如何等待多个承诺全部完成?
- javascript - 文件上传(角度)到 nginx 上的节点应用程序时出现 502 错误
- fortran - gfortran 非传统预处理器
- java - Java 新实例虚假声明空构造函数
- c# - 我对以下数组的快速排序有什么问题?