Linux
docker 容器鏡像中沒有 root 權限
我測試了一個使用以下命令啟動的 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
: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
這將解決您的問題。