当我尝试在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
答案 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)
答案 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.12
,Container 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