Подключение к X11-серверу из докера без xhost, но с xauth

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот вопрос задавался в разных формах на Stackru и в других местах, но я не мог заставить никого работать. Поэтому я надеюсь, что кто-то может помочь мне понять это раз и навсегда.

Мне нужно включить работу пересылки x11 в моем контейнере Docker без использования 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, сборка 4c52b90

версия docker-compose: 1.23.2, сборка 1110ad01

2 ответа

Ваша настройка была почти правильной, вам просто нужно изменить 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"

Если вы придерживаетесь простой командной строки вместо компоновки:

      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/

Я просто размышляю. Не могли бы вы использовать

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

Кажется, это будет работать, но я лично не пробовал. Однако вы можете решить, что просто не хотите использовать хост-сеть.

ОБНОВЛЕНИЕ: Я попробовал это, и это не работает. Я оставлю этот ответ как пример чего-то, что не работает.

Другие вопросы по тегам