我使用以下命令开始测试 Docker 容器(从 Nvidia CUDA 映像创建):
docker run -i -t xxxxxx /bin/bash
我可以看到 root 提示符,但仍然没有某些操作的权限;例如,当我执行:
dmesg
我看到“权限被拒绝”。为什么?
答案1
在现代 Linux 中,根并不一定意味着拥有最终权限。能力机制通过打破权限提供更细粒度的权限控制根的可以单独向特定任务授予/撤销特定任务的部分权力,Docker 使用这种机制。
默认情况下,Docker 在启动容器化进程时会丢弃许多危险功能,即使该进程代表运行根用户。这是因为主机内核在所有容器和主机系统之间共享,因此,来自特权容器化进程的一些系统调用可能会泄露有关(您的情况)的信息,甚至影响“外部世界”。这就是为什么即使您运行时也会看到“权限被拒绝dmesg(1)
”根。
在内部,dmesg(1)
调用syslog(2)
系统调用来获取内核日志。根据man capabilities
,此系统调用需要特定的功能 - CAP_SYSLOG
:
CAP_SYSLOG (since Linux 2.6.37)
* Perform privileged syslog(2) operations.
See syslog(2) for information on which operations require privilege.
默认情况下,此功能在 Docker 容器中被删除,因此,dmesg(1)
在您的容器中会失败。
如果您信任镜像的供应商,或者只是不太关心安全性,您可以使用附加功能启动容器 ( --cap-add syslog
):
docker run -it --cap-add syslog nvcr.io/nvidia/cuda:9.0-devel-ubuntu16.04
这将解决您的问题。