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

Running Chromium inside Docker - Gtk: cannot open display: :0

提问人:user3538553 提问时间:2/8/2015 更新时间:3/31/2023 访问量:85131

问:

当我尝试在 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
Docker X11

评论

0赞 Thomas Schütt 10/28/2020
您忘记了命令末尾的点(对于当前目录): “docker build -t chromium ”。由于新手可能会卡在这一点上,您可能应该纠正该行。

答:

76赞 Greg 2/8/2015 #1

我对铬知之甚少,但是,我确实在 X 上工作过:-)当你告诉一个 X 客户端连接到 :0 时,你说的是连接到端口 6000(或你的 X 服务器运行的任何端口)+ 0,或者在这种情况下是端口 6000。实际上,DISPLAY是IP:PORT(如上所述的+6000)。X 服务器正在您的主机上运行,因此,如果您设置:

DISPLAY=your_host_ip:0

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

xhost +

在运行 Docker 容器之前。所有这些都假设您可以在主机上运行 chromium(即,主机上存在 X 服务器)。

评论

1赞 GameScripting 7/2/2015
停止容器,在主机上运行并再次启动容器为我完成了xhost +
14赞 Andy Smith 1/7/2016
或者你似乎可以做更多的限制。xhost +local:docker
1赞 opentokix 6/9/2016
如果你做 xhost +,你基本上会禁用对你的 xwindowssystem 的访问控制。因此,如果 root 是运行 docker 守护程序的用户,请使用限制性更强的 xhost xhost +SI:localuser:root。这将只允许本地套接字连接,而不允许 Internet 或网络主机访问您的 xwindows。
20赞 Baptiste Mathus 6/24/2016
虽然很有吸引力,但不要那样做。请参阅上面的评论。该解决方案基本上允许任何人连接到您的机器。最好使用限制性更强的 stackoverflow.com/a/34586732/345845 仅允许本地连接
4赞 Konrad Botor 9/21/2020
实际上不要做这些。而是添加到参数。这将允许你的容器使用你的主机的网络堆栈,使OP的预期工作。--network=hostdocker run-e DISPLAY=$DISPLAY
48赞 RANDRIAMILASOA Stanislas 1/4/2016 #2

尝试

xhost local:root

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

评论

2赞 HugoTai 3/11/2018
在 Archlinux 上工作过,想想你,我现在可以完全使用 docker!
15赞 Alex Punnen 7/19/2018 #3

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

评论

3赞 Whoami 2/7/2019
你能提供关于这个命令的一个小解释吗?这将是非常有帮助的。
0赞 Ben Poon 3/13/2020
“xclock程序以模拟或数字形式显示时间。时间以用户指定的频率持续更新。 上面安装的 x11-apps 软件包的一部分
0赞 IcyFlame 9/5/2020
这个答案很有用!(尤其是 XAuthority 卷挂载部分) @Whoami 完成!
0赞 Chris Jaynes 10/6/2023
为什么您不想在 Dockerfile 本身中包含大多数/所有参数?--priveleged
4赞 Binita Bharati 9/21/2020 #4

因此,我还要求在我的 docker 容器中打开一个图形应用程序。因此,这些是适用于我的环境的步骤。( , ). 在运行容器之前,通过运行以下命令使主机的 X 服务器接受来自任何客户端的连接:。这是一种非常不受限制的连接到主机的 X 服务器的方式,您可以根据给出的其他答案进行限制。然后,使用选项(例如:)运行容器。容器启动后,登录到其 shell,然后使用(例如:Docker version: 19.03.12Container OS: Ubuntu 18.04xhost +--network=hostdocker run --network=host <my image name>DISPLAY=:0DISPLAY=:0 <my graphical app>)

评论

3赞 Tomilov Anatoliy 10/18/2020
--network host是我所需要的,当爬过所有互联网时。
0赞 Lars Berntzon 1/27/2021 #5

需要的是 docker-hostname 到外部主机名的别名。当使用仅以 : 开头的 DISPLAY 时,它表示 localhost。基本上,docker 内部的主机名需要通过 /etc/hosts 解析为与外部主机相同的名称 - 因为这是存储在 中的名称。X权限

7赞 Zane 7/19/2021 #6

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

docker run --rm -ti --net=host -e DISPLAY=$DISPLAY fr3nd/xeyes
0赞 Matteo Toma 11/19/2021 #7

我找到了这个脚本来自动获取您电脑的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

评论

0赞 Matteo Toma 11/19/2021
(该脚本适用于 Windows 用户,另外记得在运行 xlaunch(VcXsrv) 时标记“禁用访问控制”)
1赞 Nicholas Dalhaug 12/21/2022 #8

我让它在 Windows 主机上运行,但不能在我的 Linux Mint (Ubuntu) 主机上运行。原因是我在 Linux 上使用 Docker Desktop,它在后台使用虚拟机。

解决方案:关闭 Docker Desktop,安装 Docker Engine。除此之外,也要像其他答案一样做。

0赞 quine9997 3/31/2023 #9

我使用这个命令列表

#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