我正在运行 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 感到悲伤和困惑。使用风险由您自行承担。)
我有确切的问题,正打算按照你的评论建议去做,但我没有 想要失去portainer。 因此,在我用核武器摧毁一切之前,作为最后的努力,我尝试用 Midnight Commander 强行删除 docker 容器,幸运的是,它成功了。
我没有意识到 ZFS 有这些致命缺陷,并且将来可能不会使用它,除非这个问题得到修复(2025 年我写这篇文章时)