我正在尝试从 docker 容器内部清除文件系统缓存,如下所示:
docker run --rm ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"
如果我运行这个命令我得到
sh: 1: cannot create /proc/sys/vm/drop_caches: Read-only file system
/proc
这是预期的,因为我无法从容器内部写入。
现在当我打电话时
docker run --rm --privileged ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"
它有效,这对我来说也很有意义,因为--privileged
容器可以在主机上执行(几乎)任何操作。
我的问题是:如何找出需要在命令中设置哪些 Linux 功能
docker run --rm --cap-add=??? ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"
为了使这项工作无需设置--privileged
?
答案1
作为 Gilles 接受的答案的附录:在使用 docker 时,我成功地实现了以更简单的方式写入/proc/sys/vm/drop_caches
(或者/proc
一般来说,准确地说)的目标:
docker run -ti --rm -v /proc:/writable_proc ubuntu:vivid bash
# echo 3 > /writable_proc/sys/vm/drop_caches
这就是为了我的目的。
非常感谢您的有用回答!
答案2
文件proc
系统不支持功能、ACL,甚至不支持使用chmod
. Unix 权限决定调用进程是否获得访问权限。因此只有 root 可以写入该文件。对于用户命名空间,这就是全局根(原始命名空间中的根);容器中的 root 无法更改 sysctl 设置。
据我所知,从非特权命名空间内部更改 sysctl 设置的唯一解决方案是安排与外部的通信通道(例如套接字或管道),并让侦听进程在容器外部以 root 身份运行。
答案3
我刚刚测试了以下内容:
docker run -ti --rm -v /proc:/writable_proc rhel bash
echo 3 > /writable_proc/sys/vm/drop_caches
而且,它失败了:
bash: /writable_proc/sys/vm/drop_caches: Permission denied
我以特权运行它:
docker run -ti --rm --privileged -v /proc:/writable_proc rhel bash
echo 3 > /writable_proc/sys/vm/drop_caches
而且,一切都有效,所以我非常确定,不知何故,事情对 Gilles 有效,因为他的守护进程或 cli 被配置为在不知情的情况下使用特权: