从 docker 连接到 X11 服务器,不使用 xhost,但使用 xauth

sha*_*133 8 x11 x11-forwarding docker docker-compose

免责声明:这个问题已经在 Stackoverflow 和其他场所以不同的形式提出,但我无法解决。所以我希望有人能帮我一劳永逸地解决这个问题。

xhost由于安全问题,我需要在我的 Docker 容器上启用 x11 转发工作而不使用任何东西。我想将/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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这两个文件位于同一文件夹中。跑步:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y x11-apps xauth
Run Code Online (Sandbox Code Playgroud)

如果您在主机系统中运行xhost +,则 X 服务器将免除身份验证,并且xclock程序将成功运行。否则,它会抱怨Error: Can't open display: :0。我想解决这个问题,而无需 xhost通过公开的套接字和 X 身份验证建立与 X 服务器的成功连接。有什么帮助吗?

操作系统:Ubuntu 16.04

Docker 版本:18.09.1,内部版本 4c52b90

docker-compose版本:1.23.2,内部版本 1110ad01

小智 5

您的设置几乎是正确的,您只需将 更改network_modehost. 否则,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"
Run Code Online (Sandbox Code Playgroud)

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

docker run --rm -it --network host -e DISPLAY=$DISPLAY -v /home/<hostUser>/.Xauthority:/home/<containerUser>/.Xauthority -v /tmp/.X11-unix:/tmp/.X11-unix <container>
Run Code Online (Sandbox Code Playgroud)

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