从不带xhost但带xauth的docker连接到X11服务器

时间:2019-02-04 21:43:31

标签: docker docker-compose x11 x11-forwarding

免责声明:在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

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,内部版本4c52b90

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

1 个答案:

答案 0 :(得分:0)

我只是在推测。你能用

  • --network host
  • --env DISPLAY=127.0.0.1
  • --mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix,readonly=true

似乎可以使用,但我个人没有尝试过。但是,您可能会决定不使用主机网络。

更新:我尝试过,但是它不起作用。我将把这个答案留作无法解决问题的例子。