当我尝试在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
8条答案
按热度按时间5hcedyr01#
我对chromium了解不多,但是,我曾经在很久以前使用过X:-)当你告诉一个X客户端连接到:0时,你所说的是连接到端口6000(或者任何你的X服务器运行的端口)+ 0,或者端口6000。实际上,DISPLAY是IP:PORT(上面提到的+6000)。X服务器运行在你的主机上,所以,如果你设置:
这可能会起作用。但是,X服务器不允许从任何旧客户端进行连接,因此,您需要打开X服务器。在您的主机上,运行
所有这些都是假设您可以在您的主机上运行chromium(即您的主机上存在一个X服务器)。
5cg8jx4n2#
试试看
这个解决我的,我在Debian杰西. https://github.com/jfrazelle/dockerfiles/issues/4
fxnxkyjh3#
添加为参考(参见greg的真实的答案)
在Linux主机中添加
在Docker图像中添加
然后运行
在容器内部-检查示例命令
4ngedf3f4#
对于Ubuntu 20.04,将
DISPLAY=:0
更改为DISPLAY=$DISPLAY
为我解决了这个问题,我的本地env将$DISPLAY
设置为:1
:fnx2tebb5#
因此,我还需要在我的Docker容器中打开一个图形应用程序。因此,这些步骤适用于我的环境。(
Docker version: 19.03.12
,Container OS: Ubuntu 18.04
)。在运行容器之前,通过运行以下命令使主机的X服务器接受来自任何客户端的连接:xhost +
。这是一种连接到主机的X服务器的非常无限制的方式,您可以根据给出的其他答案进行限制。然后,运行带有--network=host
选项的容器(例如:docker run --network=host <my image name>
)。容器启动后,登录其shell,然后使用DISPLAY=:0
启动您的应用(例如:DISPLAY=:0 <my graphical app>
)mo49yndu6#
我花了一段时间来解决这个问题,所以我想在这里分享我的结果。我让它在Windows主机上工作,但在我的Linux Mint(Ubuntu)主机上不工作。原因是我在Linux上使用Docker Desktop。通过使用VM,这会表现出不同的行为,请参见here。
解决方案:关闭Docker Desktop并安装Docker Engine,请参阅here。除此之外,还请按照其他答案中的操作进行操作。
vmjh9lq97#
您需要的是一个docker-hostname到外部主机名的别名。当使用DISPLAY时,只需要:基本上,您在Docker中的主机名需要通过/etc/hosts解析为与外部主机相同的名称-因为该名称存储在.Xauthority中
nszi6y058#
我发现这个脚本自动获取您的PC的IP:
创建一个bat文件,并在其中放入以下内容: