Подключите драйвер XQuartz X11 для запуска зависимого скрипта Mayavi / GUI - PullRequest
0 голосов
/ 10 марта 2020

Я относительно новичок в работе с Docker, поэтому любая помощь с моей проблемой будет принята. Спасибо.

Проблема : Невозможно правильно смонтировать x11 в контейнер docker с необходимыми драйверами. Прочитайте несколько форумов о том, как заставить приложение GUI работать в контейнере, но по-прежнему не можете получить скрипт для полного запуска.

Какова цель : запуск сценария зависит от на Mayavi модуль, который в конечном итоге создаст образ.

Среда :

  • Ma c OSX 10.15.3
  • Docker Рабочий стол для Ма c 2.2.0.3

Dockerfile :

FROM ubuntu:18.04

ENV PATH="$HOME/.local/bin:$PATH"
RUN export PATH

ENV QT_DEBUG_PLUGINS=1
ENV QT_GRAPHICSSYSTEM="native"
ENV QT_X11_NO_MITSHM=1
ENV LIBGL_DEBUG "verbose glxgears"

RUN apt-get update && apt-get install -y \
    git \
    ca-certificates \
    make \
    curl \
    automake \
    autoconf \
    libtool \
    wget \
    pkg-config \
    xvfb \ 
    libgl1-mesa-dev \
    libqt5x11extras5 \
    libxkbcommon-x11-0 \
    libxcb-randr0-dev \
    libxcb-xtest0-dev \
    libxcb-xinerama0-dev \
    libxcb-shape0-dev \
    libxcb-xkb-dev \
    locate \
    build-essential \
    zlib1g-dev \
    libncurses5-dev \
    libgdbm-dev \
    libnss3-dev \
    libssl-dev \
    libreadline-dev \
    libffi-dev \
    libxml2-dev \
    libxslt1-dev \
    libxext-dev \
    libx11-dev \
    x11proto-gl-dev \
    mesa-utils && \
    rm -rf /var/lib/apt/lists/*

RUN apt update && apt install -y \
    software-properties-common 

RUN add-apt-repository -y ppa:deadsnakes/ppa

RUN apt update && apt install -y \
    python3.7 \
    python3.7-dev 

RUN mkdir /tmp/src
WORKDIR /tmp/src

RUN wget https://bootstrap.pypa.io/get-pip.py 
RUN python3.7 get-pip.py

RUN ln -s /usr/include/python3.7/* /usr/include/

RUN python3.7 -m pip install numpy==1.18.1 \
    && python3.7 -m pip install vtk==8.1.2 \
    && python3.7 -m pip install mayavi==4.7.1 \
    && python3.7 -m pip install pyqt5==5.14.0 

RUN mkdir -p /usr/local/bin/platforms \
    && ln -s /usr/local/lib/python 3.7/dist-packages/PyQt5/Qt/plugins/platforms/libqxcb.so /usr/local/bin/platforms 

COPY depthData.txt .
COPY image_3d.py .
COPY entrypoint.sh .

CMD ["python3.7", "my_python_script.py"]

Запуск XQuartz

open -a xquartz

Одна попытка смонтировать X11 в контейнер :

ip = $ (ifconfig en0 | grep inet | awk '$ 1 = "inet" {print $ 2} '

xhost + $ ip

Запустить контейнер:

docker run  -it -e DISPLAY=$ip:0 --name blahblahblah -v /tmp/.X11-unix:/tmp/.X11-unix test_run

RESULT :

Сценарий выполняется до инструкции по созданию изображения. Строка кода выглядит следующим образом:

mlab.savefig(path_to_outfile, size=(640, 640))

с последующей ошибкой.

QFactoryLoader::QFactoryLoader() checking directory path "/usr/local/lib/python3.7/dist-packages/PyQt5/Qt/plugins/accessible" ...
QFactoryLoader::QFactoryLoader() checking directory path "/usr/bin/accessible" ...
libGL: Can't open configuration file /etc/drirc: No such file or directory.
libGL: Can't open configuration file /root/.drirc: No such file or directory.
libGL: Can't open configuration file /etc/drirc: No such file or directory.
libGL: Can't open configuration file /root/.drirc: No such file or directory.
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
ERROR: In /work/standalone-x64-build/VTK-source/Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 606
vtkXOpenGLRenderWindow (0x55b930cc9e50): Cannot create GLX context. Aborting.

Следующая попытка :

Обновлен файл Docker:

Изменено:

 **CMD ["python3.7", "my_python_script.py"]** 

to

**#CMD ["python3.7", "my_python_script.py"]** 

** Запустите контейнер **:

docker run  -it -e DISPLAY=$ip:0 --name blahblahblah -v /tmp/.X11-unix:/tmp/.X11-unix test_run

В интерактивном контейнере выполнено следующее:

Попытка установить драйверы Nvidia:

wget http://us.download.nvidia.com/XFree86/Linux-x86_64/331.67/NVIDIA-Linux-x86_64-331.67.run .

./NVIDIA-Linux-x86_64-331.67.run -a -N --ui=none --no-kernel-module

Запустить скрипт

python3.7 my_python_script.py

РЕЗУЛЬТАТ :

Снова скрипт выполняется до инструкции по созданию изображения с последующей ошибкой:

QFactoryLoader::QFactoryLoader() checking directory path "/usr/local/lib/python3.7/dist-packages/PyQt5/Qt/plugins/accessible" ...
QFactoryLoader::QFactoryLoader() checking directory path "/usr/bin/accessible" ...
ERROR: In /work/standalone-x64-build/VTK-source/Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 606
vtkXOpenGLRenderWindow (0x562856ea07d0): Cannot create GLX context.  Aborting.

** Еще одна, немного другая попытка смонтировать X11 в контейнер **:

Заварить установку socat

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

ПРИМЕЧАНИЕ : Значение DISPLAY: / private / tmp / com.apple.launchd.IoOdg4mzJH / org.macosforge.xquartz: 0

РЕЗУЛЬТАТ :

 socat[38815] E bind(5, {LEN=0 AF=2 0.0.0.0:6000}, 16): Address already in use
...