Linux

docker 容器鏡像中沒有 root 權限

  • February 14, 2019

我測試了一個使用以下命令啟動的 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

這將解決您的問題。

引用自:https://unix.stackexchange.com/questions/500361