Запуск графического интерфейса Qt в контейнере докеровC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Запуск графического интерфейса Qt в контейнере докеров

Сообщение Anonymous »

Итак, у меня есть графический интерфейс C++ на основе Qt5, который я хочу запустить из контейнера Docker.
Когда я пытаюсь запустить его с помощью

Код: Выделить всё

docker run --rm -it my_image
это приводит к ошибке

Код: Выделить всё

qt.qpa.xcb: could not connect to display localhost:10.0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
Поэтому я искал, как это сделать. Я нашел приложение GUI Qt в контейнере докеров и на основе этого вызвал его с помощью

Код: Выделить всё

QT_GRAPHICSSYSTEM="native" docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix my_image
что привело к той же ошибке.
Затем я обнаружил, можно ли запускать приложения с графическим интерфейсом в контейнере Docker?.

Принятый ответ, кажется, специфичен для определенных приложений, таких как Firefox?

Прокрутив дальше, я получил решение, которое говорит мне установить X11UseLocalhost no в sshd_config и затем назовите это как

Код: Выделить всё

docker run -v $HOME:/hosthome:ro -e XAUTHORITY=/hosthome/.Xauthority -e DISPLAY=$(echo $DISPLAY | sed "s/^.*:/$(hostname -i):/") my_image
это приводит к небольшому варианту приведенной выше ошибки:

Код: Выделить всё

qt.qpa.xcb: could not connect to display 127.0.1.1:13.0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
После другого ответа я добавил ENV DISPLAY :0 в свой файл Dockerfile и вызвал его с помощью

Код: Выделить всё

xhost +
XSOCK=/tmp/.X11-unix/X0
docker run -v $XSOCK:$XSOCK my_image
На этот раз первая строка моей ошибки была qt.qpa.xcb: не удалось подключиться к дисплею:0.
Затем я попробовал другой ответ, добавив

Код: Выделить всё

RUN export uid=0 gid=0 && \
mkdir -p /home/developer && \
echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
echo "developer:x:${uid}:" >> /etc/group && \
mkdir /etc/sudoers.d/ && \
echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
chmod 0440 /etc/sudoers.d/developer && \
chown ${uid}:${gid} -R /home/developer
в мой файл Dockerfile и вызываю docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix my_image, снова та же ошибка.
Я также попробовал несколько способов, описанных в http://wiki.ros.org/docker/Tutorials/GUI, та же ошибка.
Я делаю что-то не так? Обратите внимание, что я работаю на удаленном компьютере через SSH, конечно, с включенной переадресацией X11 (и приложение отлично работает вне Docker). Также обратите внимание, что я пишу клиент-серверное приложение, а серверная часть, которая не нуждается в элементах графического интерфейса, но использует большую часть исходного кода, отлично работает из своего контейнера.
Надеюсь для решения, которое не требует от меня изменения системы, поскольку причина, по которой я использую Docker, в первую очередь заключается в том, чтобы пользователи моего приложения могли запустить его без особых хлопот.

Подробнее здесь: https://stackoverflow.com/questions/656 ... -container
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»