Docker下的Chrome:CAP_SYS_ADMIN与特权?[关闭]


11

我在测试环境中在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或启动容器--privileged-Chrome可以正常工作。

这两个开关有什么区别?启用了哪些功能--privileged

而且,我可以setns()在不损害安全性的情况下允许在容器内部吗?


谢谢你 我使用您的很多东​​西发布了一个问题:github.com/docker/for-linux/issues/496我认为应该解决这个问题
Merc

我来晚了将近2年,但是如果您仍然有兴趣,可以在上面的票证中找到一种更好,更安全的解决方案。
Merc

如果原始发帖人没有更新答案(他似乎根本不活跃于SO),请告诉我您是否可以接受其他人。我在此上浪费了时间,我只能想象我们会节省多少时间。
Merc

Answers:


7

在AFAICS上,文档建议授予容器所需的功能,而不要使用--privileged开关。在特权模式下运行似乎可以 为容器授予所有功能(只要文档是最新的,确切的功能将在第一个URL中列出)。

简而言之,我要说的是--cap-add=SYS_ADMIN,与--privileged开关相比,它向容器授予了更小的功能子集。事件Docker文档(第一个URL)中的示例似乎更喜欢仅在需要时添加SYS_ADMINNET_ADMIN功能。


谢谢,exec_linux.go帮助。我试图通过它克隆docker repo来grep,但是由于花了我几个小时,我才忘了它:)
Jakov Sosic

只是为了运行Chrome,这里列出了一个更好的解决方案:github.com/docker/for-linux/issues/496#issuecomment-441149510我认为更新答案将非常有益,以便人们按照我的解释进行操作那非常评论。如果您同意,请告诉我。
Merc

1

一个区别是--privileged将/ dev和/ sys挂载为RW,而SYS_ADMIN将它们挂载为RO。这意味着特权容器可以完全访问系统上的设备。SYS_ADMIN没有给您。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.