Подключение к 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
Кажется, это будет работать, но я лично не пробовал. Однако вы можете решить, что просто не хотите использовать хост-сеть.
ОБНОВЛЕНИЕ: Я попробовал это, и это не работает. Я оставлю этот ответ как пример чего-то, что не работает.