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

use*_*553 36 x11 chromium docker

当我尝试在docker容器中运行chrome时,我看到以下错误:Gtk:无法打开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"]
Run Code Online (Sandbox Code Playgroud)

构建和运行:

docker build -t chromium
docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged chromium
Run Code Online (Sandbox Code Playgroud)

和错误:

[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
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 54

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

DISPLAY=your_host_ip:0
Run Code Online (Sandbox Code Playgroud)

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

xhost +
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然很有吸引力,但请不要这样做*.请参阅上面的评论.该解决方案基本上**允许任何人连接到您的机器**.更喜欢使用限制性更强的http://stackoverflow.com/a/34586732/345845,只允许本地连接 (14认同)
  • 或者看起来你可以做`xhost + local:docker`更具限制性. (10认同)
  • 如果你使用 xhost +,你基本上会禁用对 xwindows 系统的访问控制。因此,如果 root 是运行 docker 守护程序的用户,请使用限制性更强的 xhost,例如 xhost +SI:localuser:root。这将只允许本地套接字连接,而不允许互联网或网络主机访问您的 xwindows。 (2认同)
  • 实际上,这两件事都不要做。而是将“--network=host”添加到“docker run”参数中。这将允许您的容器使用主机的网络堆栈,使“-e DISPLAY=$DISPLAY”按照OP的预期工作。 (2认同)

小智 30

尝试

xhost local:root
Run Code Online (Sandbox Code Playgroud)

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

  • 在 Archlinux 上工作过,你想,我现在可以完全使用 docker 了! (2认同)

Ale*_*nen 9

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

在 Docker 镜像中添加

RUN apt-get update
RUN apt-get install -qqy x11-apps
Run Code Online (Sandbox Code Playgroud)

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

然后运行

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
Run Code Online (Sandbox Code Playgroud)

检查示例命令

xclock
Run Code Online (Sandbox Code Playgroud)

  • 你能提供一个关于这个命令的小解释吗?这会很有帮助。 (2认同)

Zan*_*per 7

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

docker run --rm -ti --net=host -e DISPLAY=$DISPLAY fr3nd/xeyes
Run Code Online (Sandbox Code Playgroud)