提问人:user3538553 提问时间:2/8/2015 更新时间:3/31/2023 访问量:85131
在Docker中运行Chromium - Gtk:无法打开显示::0
Running Chromium inside Docker - Gtk: cannot open display: :0
问:
当我尝试在 docker 容器中运行 chromium 时,我看到以下错误: Gtk: cannot open 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"]
生成并运行:
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
答:
我对铬知之甚少,但是,我确实在 X 上工作过:-)当你告诉一个 X 客户端连接到 :0 时,你说的是连接到端口 6000(或你的 X 服务器运行的任何端口)+ 0,或者在这种情况下是端口 6000。实际上,DISPLAY是IP:PORT(如上所述的+6000)。X 服务器正在您的主机上运行,因此,如果您设置:
DISPLAY=your_host_ip:0
那可能会起作用。但是,X 服务器不允许来自任何旧客户端的连接,因此,您需要打开 X 服务器。在主机上,运行
xhost +
在运行 Docker 容器之前。所有这些都假设您可以在主机上运行 chromium(即,主机上存在 X 服务器)。
评论
xhost +
xhost +local:docker
--network=host
docker run
-e DISPLAY=$DISPLAY
尝试
xhost local:root
这解决了我的,我在 Debian Jessie 上。https://github.com/jfrazelle/dockerfiles/issues/4
评论
添加作为参考(参见 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
容器内部 -check 示例命令
xclock
评论
--priveleged
因此,我还要求在我的 docker 容器中打开一个图形应用程序。因此,这些是适用于我的环境的步骤。( , ).
在运行容器之前,通过运行以下命令使主机的 X 服务器接受来自任何客户端的连接:。这是一种非常不受限制的连接到主机的 X 服务器的方式,您可以根据给出的其他答案进行限制。然后,使用选项(例如:)运行容器。容器启动后,登录到其 shell,然后使用(例如:Docker version: 19.03.12
Container OS: Ubuntu 18.04
xhost +
--network=host
docker run --network=host <my image name>
DISPLAY=:0
DISPLAY=:0 <my graphical app>
)
评论
--network host
是我所需要的,当爬过所有互联网时。
需要的是 docker-hostname 到外部主机名的别名。当使用仅以 : 开头的 DISPLAY 时,它表示 localhost。基本上,docker 内部的主机名需要通过 /etc/hosts 解析为与外部主机相同的名称 - 因为这是存储在 中的名称。X权限
对于 Ubuntu 20.04,更改为我修复它,我的本地环境已设置为:DISPLAY=:0
DISPLAY=$DISPLAY
$DISPLAY
:1
docker run --rm -ti --net=host -e DISPLAY=$DISPLAY fr3nd/xeyes
我找到了这个脚本来自动获取您电脑的ip:
FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set localIp=%%i
创建一个蝙蝠文件,并把这个蝙蝠放进去:
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
评论
我让它在 Windows 主机上运行,但不能在我的 Linux Mint (Ubuntu) 主机上运行。原因是我在 Linux 上使用 Docker Desktop,它在后台使用虚拟机。
解决方案:关闭 Docker Desktop,安装 Docker Engine。除此之外,也要像其他答案一样做。
我使用这个命令列表
#host operating system; bash_shell1
i. environment debian11 MX-21.3_x64 ahs
i. become sudo
sudo su
password
i. docker restart
service docker restart
i. download/pull image
docker pull ubuntu:jammy
i. check #dockerip
sudo ip addr show docker0
#output: 172.17.0.1
i. check ps
docker ps
#output: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
i. check images
docker images
#output:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu jammy 08d22c0ceb15 3 weeks ago 77.8MB
hello-world latest feb5d9fea6a5 18 months ago 13.3kB
i. CONNECT/DISCONNET xserver
# Disallow X server connection
xhost -local:*
# Allow X server connection
xhost +local:*
i. set up gui/display etc
service docker restart
sleep 2
DISPLAY=:0
xhost +
i. only create docker container
containername=custom_container_001
SOCK=/tmp/.X11-unix docker run --name $containername -d -it --rm --privileged --volume "$HOME/.Xauthority:/root/.Xauthority:ro" -p 8080:8080 --network=host -e DISPLAY=$DISPLAY -v $XSOCK:$XSOCK ubuntu:jammy
i. execute bash
docker exec -it $containername bash; history -a
-----------------------------
#guest operating system; bash_shell1
i. now we are inside the ubuntu container, install mousepad or xclock and runn it
apt update -y
apt install mousepad -y
mousepad
apt install x11-apps -y
xclock
#try this command too
apt install xclock -y
xclock
-----------------------------
#host operating system; bash_shell2
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8af08xxxcc64 ubuntu:jammy "/bin/bash" 20 minutes ago Up 20 minutes custom_container_001
评论