无法删除 Docker 中的 btrfs 子卷

无法删除 Docker 中的 btrfs 子卷

我的主机系统上有一个 btrfs 分区(安装在 上/srv),其中有一个子卷(old)。我想从 docker 容器管理它(我已经用 启动了它-v /srv:/srv)。

虽然我完全能够创建它的快照,但我无法列出其他子卷和/或删除它们:

user@host:~$ docker exec -ti jenkins-slave bash
root@a5496f6bd14b:~# btrfs subvolume snapshot /srv/old /srv/new
Create a snapshot of '/srv/old' in '/srv/new'
root@a5496f6bd14b:~# ls /srv
new old
root@a5496f6bd14b:~# btrfs subvolume delete /srv/new
Delete subvolume (no-commit): '/srv/new'
ERROR: cannot delete '/srv/new': Operation not permitted
root@a5496f6bd14b:~# btrfs subvolume list /srv/new
ERROR: can't perform the search - Operation not permitted
root@a5496f6bd14b:~# ls /srv
new old

尽管我仍然能够从主机系统执行此操作。

答案1

看起来此行为是由于 Docker 配置设置造成的。

我可以通过在 Docker 运行时添加“Linux 功能”CAP_SYS_ADMIN 来实现这一点。

docker run -d -t --cap-add SYS_ADMIN -v /mnt.btrfs:/mnt.btrfs debbtrfs

CAP_SYS_ADMIN
执行一系列系统管理操作,包括:quotactl(2)、mount(2)、umount(2)、swapon(2)、swapoff(2)、sethostname(2) 和 setdomainname(2)

还有一系列其他的“Linux 功能”,包括可以在手册页中找到的 CAP_SYS_ADMIN 的详细描述:

$ man 7 capabilities

哪些功能是 Docker 默认功能,哪些可以添加/删除,可以在这里的“运行时权限和 Linux 功能”下找到:
https://docs.docker.com/engine/reference/run/

相关内容