Permissions
Docker 下的 Chrome:CAP_SYS_ADMIN 與特權?
我在測試環境中的 Docker 中執行 chromedriver + chrome。
在最新的 CoreOS 升級之前,一切正常。
這些是似乎工作的版本:
VERSION=1185.5.0 VERSION_ID=1185.5.0 BUILD_ID=2016-12-07-0937
這是一個導致 chrome 核心轉儲的較新版本:
VERSION=1235.4.0 VERSION_ID=1235.4.0 BUILD_ID=2017-01-04-0450
查看更改,似乎 docker 已從 1.11.x 升級到 1.12.x,這破壞了
setns()
容器內的呼叫。setns()
Chrome 使用它來創建命名空間。這是範例輸出:
jsosic-coreos-test-20161207 ~ # docker --version Docker version 1.11.2, build bac3bae
從這個盒子上的一個容器內:
[root@2939f21ecfaa /]# /opt/google/chrome/google-chrome [57:57:0107/015130:ERROR:browser_main_loop.cc(261)] Gtk: cannot open display:
這就是新版本打破它的方式:
jsosic-coreos-test-2017-01-04 ~ # docker --version Docker version 1.12.3, build 34a2ead [root@13ab34c36c82 /]# /opt/google/chrome/chrome Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted Aborted (core dumped)
我發現如果我使用
--cap-add=SYS_ADMIN
or啟動容器--privileged
- Chrome 會按預期工作。這兩個開關有什麼區別?啟用了哪些功能
--privileged
?而且,我可以
setns()
在不影響安全性的情況下允許進入容器嗎?
AFAICS,文件建議授予容器所需的功能,而不是使用
--privileged
交換機。在特權模式下執行似乎授予 容器所有功能(如果文件是最新的,那麼第一個 URL 中列出的正是這些功能)。簡而言之,與交換機
--cap-add=SYS_ADMIN
相比,我會說它為容器提供了更小的功能子集。--privileged
事件 Docker 文件(第一個 URL)中的範例似乎更喜歡在需要的地方添加SYS_ADMIN
orNET_ADMIN
功能。