在Docker内运行 chrome -Gtk:无法打开显示器::0人

eqzww0vc  于 2022-12-22  发布在  Docker
关注(0)|答案(8)|浏览(143)

当我尝试在Docker容器中运行chromium时,我看到以下错误:Gtk:无法打开显示器::0人
停靠文件:(基于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
5hcedyr0

5hcedyr01#

我对chromium了解不多,但是,我曾经在很久以前使用过X:-)当你告诉一个X客户端连接到:0时,你所说的是连接到端口6000(或者任何你的X服务器运行的端口)+ 0,或者端口6000。实际上,DISPLAY是IP:PORT(上面提到的+6000)。X服务器运行在你的主机上,所以,如果你设置:

DISPLAY=your_host_ip:0

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

xhost +

所有这些都是假设您可以在您的主机上运行chromium(即您的主机上存在一个X服务器)。

5cg8jx4n

5cg8jx4n2#

试试看

xhost local:root

这个解决我的,我在Debian杰西. https://github.com/jfrazelle/dockerfiles/issues/4

fxnxkyjh

fxnxkyjh3#

添加为参考(参见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
4ngedf3f

4ngedf3f4#

对于Ubuntu 20.04,将DISPLAY=:0更改为DISPLAY=$DISPLAY为我解决了这个问题,我的本地env将$DISPLAY设置为:1

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

fnx2tebb5#

因此,我还需要在我的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>

mo49yndu

mo49yndu6#

我花了一段时间来解决这个问题,所以我想在这里分享我的结果。我让它在Windows主机上工作,但在我的Linux Mint(Ubuntu)主机上不工作。原因是我在Linux上使用Docker Desktop。通过使用VM,这会表现出不同的行为,请参见here
解决方案:关闭Docker Desktop并安装Docker Engine,请参阅here。除此之外,还请按照其他答案中的操作进行操作。

vmjh9lq9

vmjh9lq97#

您需要的是一个docker-hostname到外部主机名的别名。当使用DISPLAY时,只需要:基本上,您在Docker中的主机名需要通过/etc/hosts解析为与外部主机相同的名称-因为该名称存储在.Xauthority中

nszi6y05

nszi6y058#

我发现这个脚本自动获取您的PC的IP:

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

创建一个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

相关问题