【问题标题】:Running Chromium inside Docker - Gtk: cannot open display: :0在 Docker 中运行 Chromium - Gtk:无法打开显示:0
【发布时间】:2022-03-23 13:52:45
【问题描述】:

当我尝试在 docker 容器中运行 chromium 时,我看到以下错误:Gtk: cannot open display: :0

Dockerfile:(基于https://registry.hub.docker.com/u/jess/chromium/dockerfile

FROM debian:jessie

# Install Chromium
RUN sed -i.bak 's/jessie main/jessie main contrib non-free/g' /etc/apt/sources.list && \
    apt-get update && apt-get install -y \
    chromium \
    chromium-l10n \
    libcanberra-gtk-module \
    libexif-dev \
    libpango1.0-0 \
    libv4l-0 \
    pepperflashplugin-nonfree \                                                                          
    --no-install-recommends && \
    mkdir -p /etc/chromium.d/

# Autorun x11vnc
CMD ["/usr/bin/chromium", "--no-sandbox", "--user-data-dir=/data"]

构建并运行:

docker build -t chromium
docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged chromium

和错误:

[1:1:0202/085603:ERROR:browser_main_loop.cc(164)] Running without the SUID sandbox! See https://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment for more information on developing with the sandbox on.
No protocol specified
[1:1:0202/085603:ERROR:browser_main_loop.cc(210)] Gtk: cannot open display: :0

【问题讨论】:

  • 您忘记了命令末尾的点(对于当前目录):“docker build -t chromium”。由于新手可能会卡在这一点上,您也许应该更正那条线。

标签: docker x11 chromium


【解决方案1】:

我对 chromium 了解不多,但是,我确实在 X 的时候使用过 :-) 当你告诉 X 客户端连接到 :0 时,你所说的是连接到端口 6000(或任何你的X 服务器运行在) + 0,或者在这种情况下是端口 6000。事实上,DISPLAY 是 IP:PORT(上面提到的 +6000)。 X 服务器正在您的主机上运行,​​因此,如果您设置:

DISPLAY=your_host_ip:0

这可能行得通。但是,X 服务器不允许来自任何旧客户端的连接,因此,您需要打开您的 X 服务器。在你的主机上,运行

xhost +

在运行 docker 容器之前。所有这一切都假设您可以在您的主机上运行 chromium(也就是说,您的主机上存在 X 服务器)。

【讨论】:

  • 停止容器,在主机上运行 xhost + 并再次启动容器为我做了这件事
  • 或者您似乎可以使用xhost +local:docker 来限制更多。
  • 如果您使用 xhost +,您将基本上禁用对 xwindows 系统的访问控制。因此,如果 root 是运行 docker 守护进程的用户,请使用更严格的 xhost,例如 xhost +SI:localuser:root。这将只允许本地套接字连接,而不是互联网或网络主机访问您的 xwindows。
  • 虽然很吸引人,但不要那样做。请参阅上面的评论。该解决方案基本上允许任何人连接到您的机器。更喜欢使用更严格的 stackoverflow.com/a/34586732/345845 只允许本地连接
  • 其实这两样都不要。而是将--network=host 添加到docker run 参数。这将允许您的容器使用主机的网络堆栈,使 -e DISPLAY=$DISPLAY 按 OP 的预期工作。
【解决方案2】:

试试

xhost local:root

这解决了我的问题,我在 Debian Jessie 上。 https://github.com/jfrazelle/dockerfiles/issues/4

【讨论】:

  • 在 Archlinux 上工作过,想想你,我现在可以去完整的 docker 了!
【解决方案3】:

添加为参考(见 greg 的真实答案)

在你的 Linux 主机中添加

  xhost +"local:docker@"

在 Docker 镜像中添加

RUN apt-get update
RUN apt-get install -qqy x11-apps

然后运行

sudo docker run \
    --rm \ # delete container when bash exits
    -it \ # connect TTY
    --privileged \
    --env DISPLAY=unix$DISPLAY \ # export DISPLAY env variable for X server
    -v $XAUTH:/root/.Xauthority \ # provide authority information to X server
    -v /tmp/.X11-unix:/tmp/.X11-unix \ # mount the X11 socket
    -v /home/alex/coding:/coding \
    alexcpn/nvidia-cuda-grpc:1.0 bash

在容器内 - 检查示例命令

xclock

【讨论】:

  • 你能提供一个关于这个命令的小解释吗?这会很有帮助。
  • "xclock 程序以模拟或数字形式显示时间。时间以用户指定的频率连续更新。"上面安装的 x11-apps 包的一部分
  • 这个答案很有用! (尤其是 XAuthority 卷安装部分)@Whoami Done!
【解决方案4】:

对于 Ubuntu 20.04,将 DISPLAY=:0 更改为 DISPLAY=$DISPLAY 为我修复了它,我的本地环境已将 $DISPLAY 设置为 :1

docker run --rm -ti --net=host -e DISPLAY=$DISPLAY fr3nd/xeyes

【讨论】:

    【解决方案5】:

    所以,我还需要在我的 docker 容器中打开一个图形应用程序。因此,这些步骤适用于我的环境。(Docker version: 19.03.12Container OS: Ubuntu 18.04)。 在运行容器之前,通过运行以下命令使主机的 X 服务器接受来自任何客户端的连接:xhost +。这是连接到主机 X 服务器的一种非常非限制性的方式,您可以根据给出的其他答案进行限制。然后,使用--network=host 选项运行容器(例如:docker run --network=host <my image name>)。容器启动后,登录到其 shell,然后使用 DISPLAY=:0 启动您的应用程序(例如:DISPLAY=:0 <my graphical app>

    【讨论】:

    • --network host 是我在整个互联网上爬行时所需要的。
    【解决方案6】:

    需要的是您的 docker-hostname 到外部主机名的别名。当使用仅以 : 开头的 DISPLAY 时,它表示 localhost。基本上,您在 docker 中的主机名需要通过 /etc/hosts 解析为与外部主机相同的名称 - 因为这是存储在 .Xauthority 中的名称

    【讨论】:

      【解决方案7】:

      我发现这个脚本可以自动获取你电脑的 ip:

      FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set localIp=%%i
      

      创建一个bat文件并将这个bat放入:

      FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set 
      localIp=%%i
      docker run -ti -v /tmp/.X11-unix -v /tmp/.docker.xauth -e 
      XAUTHORITY=/tmp/.docker.xauth --net=host -e DISPLAY=%localIp%:0.0 your-container
      

      【讨论】:

      • (该脚本是给Windows用户的,另外记得在运行xlaunch(VcXsrv)时标记“禁用访问控制”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      相关资源
      最近更新 更多