免责声明:这个问题已经在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