【发布时间】:2015-03-11 13:01:07
【问题描述】:
我有以下场景:
- 我设置了一个可以访问 X11 套接字的 Docker 容器,基本上我是这样做的:https://stackoverflow.com/a/25334301
- 然后我在容器中安装了 Firefox,并在 bash 中使用“firefox”命令启动它。
我注意到:如果 Firefox 在我在容器中启动时已经在我的主机上运行,它本质上是“逃逸”了容器,因为它只是打开了 Firefox 主机实例的新窗口。因此,它可以访问主机上的所有内容,并且容器变得无用。
反之亦然:如果 Firefox 没有在主机上运行,而我在容器中启动了一个实例,它实际上是在容器内运行。如果我随后在主机上启动 Firefox,新实例也在容器内运行。
但是,我无法使用 gvim 而不是 Firefox 重现此行为。
我很清楚 X11 套接字共享固有的安全问题,但我无法解释我上面描述的场景。为什么容器可以在其受限环境之外启动一个“进程”——或者更确切地说是一个窗口?我的主机系统怎么可能仅仅因为同一个程序已经在容器中运行而在容器中启动一个进程?
(请注意,除了“进程”之外,我不知道如何调用程序的这种图形实例,尽管在这种情况下它可能不是真正的进程......)
系统:Ubuntu GNOME 14.10、Docker 1.5、ubuntu:最新的 Docker 镜像。
更新:如果我使用 -new-instance 标志启动 Firefox,则不会发生这种情况,因此它似乎更像是 Firefox 问题而不是 X11 套接字问题。
更新 2:似乎这也发生在其他场景中,例如使用带有 X-forwarding 的 ssh:
https://unix.stackexchange.com/questions/104476/why-starting-firefox-from-command-line-in-vm-starts-the-firefox-in-the-host-ma
和
https://superuser.com/questions/462055/launching-firefox-on-remote-server-causes-local-firefox-to-open-the-page-instead
现在的问题是,Firefox 到底是如何做到这一点的?他们使用什么样的 X11 魔法来确定 Firefox 是否已经在运行?
【问题讨论】:
标签: sockets user-interface firefox docker x11