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