在Docker中运行Chromium - Gtk:无法打开display :: 0

时间:2015-02-08 10:33:11

标签: docker x11 chromium

当我尝试在docker容器中运行chrome时,我看到以下错误:Gtk:无法打开显示:: 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

6 个答案:

答案 0 :(得分:51)

我对铬知之甚少,但是,当我告诉X客户端连接到:0时,我确实使用X方式工作:0,你所说的是连接到端口6000(或任何你的在这种情况下,X服务器运行)+ 0或端口6000。实际上,DISPLAY是IP:PORT(如上所述+6000)。 X服务器正在您的主机上运行,​​因此,如果您设置:

DISPLAY=your_host_ip:0

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

xhost +

在运行docker容器之前。所有这一切都假设您可以在主机上运行chrome(即主机上存在X服务器)。

答案 1 :(得分:27)

尝试

xhost local:root

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

答案 2 :(得分:3)

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

在Docker映像中添加

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

https://people.ece.cornell.edu/skand/post/x-forwarding-on-docker/

然后运行

sudo docker run  --env DISPLAY=unix$DISPLAY --privileged --volume $XAUTH:/root/.Xauthority --volume /tmp/.X11-unix:/tmp/.X11-unix  --rm --runtime=nvidia --rm -it -v /home/alex/coding:/coding  alexcpn/nvidia-cuda-grpc:1.0 bash

检查示例命令

xclock

答案 3 :(得分:3)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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