/srv
我的主机系统上有一个带有子卷 ( )的 btrfs 分区(安装在上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
虽然我仍然可以从主机系统中做到这一点。
看来这种行为是由于 Docker 配置设置造成的。
我能够通过在 Docker 运行时添加“Linux 功能”CAP_SYS_ADMIN 来实现这一点。
docker run -d -t --cap-add SYS_ADMIN -v /mnt.btrfs:/mnt.btrfs debbtrfs
还有一系列其他“Linux 功能”,包括可以在手册页中找到的 CAP_SYS_ADMIN 的详细描述:
$ man 7 capabilities
这些功能中哪些是 Docker 默认值,哪些可以添加/删除,可以在此处的“运行时权限和 Linux 功能”下找到:
https ://docs.docker.com/engine/reference/run/