docker - zfs:文件系统有依赖的克隆
问题描述
我正在运行 Ubuntu 20.04 并在我的系统驱动器上使用 zfs。
我正在尝试删除 docker 容器,但出现此错误:
glen $ docker rm c3250e315b06
Error response from daemon: container c3250e315b0631cc7fee17ab0c7f649a3995ea17e969705117e064a045b3775e: driver "zfs" failed to remove root filesystem: exit status 1: "/usr/sbin/zfs fs destroy -r rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d109cf1c84f20db9e6402fef9a4bd91fa8b94f1848a874539663bbdc40" => cannot destroy 'rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d109cf1c84f20db9e6402fef9a4bd91fa8b94f1848a874539663bbdc40': filesystem has dependent clones
use '-R' to destroy the following datasets:
rpool/ROOT/ubuntu_bl0u7i/var/lib/38ff67538bf4b2ccfef54cfeb55847cf6da6bee70a6bf2e5b063ab0e5820c0fd
rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d109cf1c84f20db9e6402fef9a4bd91fa8b94f1848a874539663bbdc40-init
我不知道从哪里开始出错。
任何人都可以帮忙吗?
编辑:
我从这条评论中修复了它:https ://github.com/moby/moby/issues/36967#issuecomment-676698563
但它摧毁了我所有的容器
解决方案
我不确定如何通过 Docker 进行操作,但 ZFS 告诉您文件系统rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d...bbdc40
有几个从该文件系统上的快照创建的克隆。为了争论,假设只有一个,并且克隆的文件系统被称为clone1
,它是在文件系统上创建snapshot1
的rpool/...bbdc40
。所以你的层次结构是这样的:
rpool/...bbdc40 -> rpool/...bbdc40@snapshot1 -> clone1
问题是它clone1
仍在引用来自 的数据snapshot1
,因此您无法删除快照,这会阻止您删除原始文件系统。
但是,ZFS 允许您使用以下zfs promote
命令更改“父”文件系统的身份,这使您可以将层次结构更改为:
clone1 -> clone1@snapshot1 -> rpool/...bbdc40
现在没有人依赖于其中的数据rpool/...bbdc40
(因为快照已被移动到新提升的父级,clone1
),因此您可以将其删除。
(也就是说,Docker 可能假设它可以完全控制其文件系统的状态,所以如果你到处运行随机 ZFS 命令,它可能会让 Docker 感到悲伤和困惑。使用风险自负。)
推荐阅读
- c# - 如何发布具有多个项目的解决方案?
- docker - 创建 Docker 映像但 docker run 抛出错误:无法找到或加载主类 org.gradle.wrapper.GradleWrapperMain
- c# - C# Windows Service 使用 Foreach 循环的 CPU 使用率高,如何最小化 CPU 使用率?
- html - 如何通过双击 HTML 表格行导航到另一个页面?
- javascript - 你如何使用从 HtDP 到 ReactJS 的知识?
- excel - 如何使用用户表单分别编辑具有不同行和列的单元格中的数据
- javascript - 在不切换的情况下将新 iframe 加载到 javascript 中折叠
- react-native - 在 Atom 中注释掉代码会给我一个错误
- scala - 如果 trait 的 val 在课堂上被覆盖,为什么还要评估它?
- excel - VBA 如何以编程方式使用条件格式并将其仅应用于数字