使用xauth而非xhost,在Docker中连接到X11服务器

7

免责声明:这个问题已经在Stackoverflow和其他场所以不同的形式被问过了,但我无法让它们正常工作。因此,我希望有人能够帮助我彻底解决这个问题。

我需要在我的Docker容器中启用x11-forwarding,而且完全不使用xhost,因为这会存在安全问题。我想将/tmp/.X11-unix套接字和~/.Xauthority暴露给Docker容器,这样它就可以像客户端一样使用它们来连接X服务器。

我将我的问题简化为一个简单的Dockerfile。我有一个docker-compose.yml文件来运行那个Dockerfile

Dockerfile

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y x11-apps xauth

docker-compose.yml:

version: '2.3'
services:
  test:
    build: .
    command: /bin/bash
    environment:
      DISPLAY: $DISPLAY
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
      - ~/.Xauthority:/root/.Xauthority

这两个文件位于同一个文件夹中。要运行:

# To build the container
$ docker-compose up --build
# To run it
$ docker-compose run test

# In the container run:
$ xclock

# See the xauth list
$ xauth list

如果在主机系统中运行 xhost +,则 X 服务器将放弃身份验证,xclock 程序将成功运行。否则,它将抱怨 Error: Can't open display: :0
我想解决这个问题,不使用 xhost,只需通过暴露的套接字和 X 身份验证建立与 X 服务器的成功连接即可。有什么帮助吗? 操作系统: Ubuntu 16.04 Docker 版本: 18.09.1, build 4c52b90 docker-compose 版本: 1.23.2, build 1110ad01

有任何线索吗?我也遇到了类似的问题,但是我还没有找到解决方法。我还有一个限制,就是我不能使用network_mode: "host",因为我有多个容器彼此通信... - Saeid Bagheri
1个回答

5

您的设置几乎正确,只需要将 network_mode 更改为 host 即可。否则,Docker 将为容器创建一个单独的网络,因此我们无法连接到主机 xServer 实例。

请尝试使用此 Docker Compose 文件:

version: '2.3'
services:
  test:
    build: .
    command: /bin/bash
    environment:
      DISPLAY: $DISPLAY
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
      - ~/.Xauthority:/root/.Xauthority
    network_mode: "host"

如果您坚持使用简单的命令行而不是Compose:

docker run --rm -it --network host -e DISPLAY=$DISPLAY -v /home/<hostUser>/.Xauthority:/home/<containerUser>/.Xauthority -v /tmp/.X11-unix:/tmp/.X11-unix <container>

请查看此教程以获取更多信息:https://www.cloudsavvyit.com/10520/how-to-run-gui-applications-in-a-docker-container/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接