如何从 docker 容器运行 Chromium

zab*_*mba 10 ubuntu chrome x11 docker

环境

  • MacOS 塞拉利昂 10.12.6
  • Docker 版本 17.09.0-ce,构建 afdb6d4
  • Ubuntu 16.04
  • XQuartz 2.7.9

我想将 Chromium 浏览器从 docker 容器打开到我的 Mac 桌面。

docker run -i -t ubuntu:16.04 /bin/bash
apt-get update
apt-get install alsa-base chromium-browser xauth
adduser myuser
Run Code Online (Sandbox Code Playgroud)

犯罪

docker commit 2862a7bfcc2f  acme/mycontainer:0.1
Run Code Online (Sandbox Code Playgroud)

myuser从容器运行 Chrome 浏览器失败

docker run --user myuser -i -t acme/mycontainer:0.1 /usr/bin/chromium-browser
Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我敢打赌还有更多

任何指针?

UDPATE - 使用 --privileged

删除错误See thread on serverfault但 UI 不显示

docker run \
       --privileged \
       --user mysuer \
       -i -t acme/mycontainer:0.1 /usr/bin/chromium-browser
Run Code Online (Sandbox Code Playgroud)

和这个

docker run \
   --privileged \
   --net host \
   -v /tmp/.X11-unix:/tmp/.X11-unix \
   -e DISPLAY=$DISPLAY \
   -e XAUTHORITY=/.Xauthority \
   -v ~/.Xauthority:/.Xauthority:ro \
   --name chromium \
   --user mysuser \
   -i -t acme/mycontainer:0.1 /usr/bin/chromium-browser
Run Code Online (Sandbox Code Playgroud)

铬不显示

更新 20171011

docker run \
   --privileged \
   --net host \
   -v /tmp/.X11-unix \
   -e DISPLAY \
   --name chromium \
   --user myuser \
   -i -t acme/mycontainer:0.1 \
   bash
Run Code Online (Sandbox Code Playgroud)

启动 Chromium Gtk: cannot open display: [...] org.macosforge.xquartz:0错误

$ chromium-browser --verbose
[37:37:1011/154632.348303:VERBOSE1:breakpad_linux.cc(1978)] Breakpad disabled
[1:1:1011/154632.378280:VERBOSE1:zygote_main_linux.cc(537)] ZygoteMain: initializing 0 fork delegates
[1:1:1011/154632.378653:INFO:cpu_info.cc(50)] Available number of cores: 4
[37:37:1011/154632.381303:WARNING:browser_main_loop.cc(275)] Gtk: cannot open display: \
      /private/tmp/com.apple.launchd.Y2wR3QWw57/org.macosforge.xquartz:0
Run Code Online (Sandbox Code Playgroud)

在我的 Mac 上编辑 sshd_config

sudo vim /etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset 10
XAuthLocation /opt/X11/bin/xauth
Run Code Online (Sandbox Code Playgroud)

在我的 Mac 上 DISPLAY

$ env | grep DISPLAY
DISPLAY=/private/tmp/com.apple.launchd.Y2wR3QWw57/org.macosforge.xquartz:0
Run Code Online (Sandbox Code Playgroud)

在磁盘上

ls -al /private/tmp/com.apple.launchd.gCYQToI4lb/*
srw-rw-rw-  1 joel  wheel     0B Oct 11 17:50 
/private/tmp/com.apple.launchd.gCYQToI4lb/org.macosforge.xquartz:0=
Run Code Online (Sandbox Code Playgroud)

M C*_*rad 2

我没有 Mac 可供试验,但这里有一些一般性建议:

X11 通常受到密钥文件的保护,该文件只能由拥有显示器的用户读取,因此使用文件系统权限来断言只有可以读取该文件的其他程序才能连接。客户端读取该文件,然后通过套接字将其内容重复到服务器。所以,我认为你走在正确的轨道上

-e XAUTHORITY=/.Xauthority \
-v ~/.Xauthority:/.Xauthority:ro \
Run Code Online (Sandbox Code Playgroud)

接下来,您显示 SSH X11 转发设置,但没有指示您通过 ssh 进入 docker 容器。SSH 转发通常用于:

ssh $HOST -X program-which-launches-gui
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,你需要在 docker 容器内运行 SSH 服务器,这需要一些努力......

接下来,你展示一个DISPLAY=/path/to/socket我以前没有使用过的。如果这是 MacOS 的发明,那么 Docker 化的 Ubuntu 可能无法理解该格式。

最后,您可以使用 docker 容器内部的“strace”命令查看 chrome 实际上正在尝试执行的操作。

strace chromium-browser 2>&1 | egrep "open|stat|connect|bind"
Run Code Online (Sandbox Code Playgroud)

这可能会帮助您在放弃之前缩小哪些特定操作失败的范围。