我的主机系统上有一个 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/