Docker下的Chrome:CAP_SYS_ADMIN vs特权?

我在我的testing环境中运行了Docker中的chromedriver + chrome。

一切工作正常,直到最新的CoreOS升级。

这些是似乎工作的版本:

VERSION=1185.5.0 VERSION_ID=1185.5.0 BUILD_ID=2016-12-07-0937 

这是一个更新的版本,导致铬coredump:

 VERSION=1235.4.0 VERSION_ID=1235.4.0 BUILD_ID=2017-01-04-0450 

看着变化,似乎docker从1.11.x升级到1.12.x,这打破了容器内的setns()调用。 Chrome使用setns()来创build名称空间。

这是示例输出:

 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--privileged启动容器 – Chrome按预期工作。

这两个交换机有什么区别? 哪些function是由 – --privileged启用的?

而且,我可以允许setns()在容器内而不危及安全性吗?

AFAICS,文档build议授予容器所需的function,而不是使用--privileged开关。 在特权模式下运行似乎授予 容器的所有function (确切地说,那些在第一个URL中列出,只要文档是最新的)。

总之,我会说--cap-add=SYS_ADMIN赋予容器更小的function子集,与--privileged开关相比。 事件Docker文档中的示例(第一个URL)似乎更喜欢只在需要时添加SYS_ADMINNET_ADMINfunction。