我在测试环境中在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