免责声明:在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
答案 0 :(得分:0)
我只是在推测。你能用
--network host
,--env DISPLAY=127.0.0.1
和--mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix,readonly=true
似乎可以使用,但我个人没有尝试过。但是,您可能会决定不使用主机网络。
更新:我尝试过,但是它不起作用。我将把这个答案留作无法解决问题的例子。