2016-09-16 5 views
1

После установки различных пакетов и программ, таких как vtk, tvtk, ParaView, mayavi, ... в моей системе, я заканчиваю полностью разбитыми глобальными пакетами. Например: в настоящее время я не могу запустить mayavi более нескольких секунд, чем сбой без какого-либо сообщения. Проблема в том, что для каждой библиотеки требуется другая версия зависимостей (в частности, Qt4 vs. Qt5), вам когда-то нужно вручную создавать программное обеспечение, чтобы разрешить некоторые нестандартные функции (ParaView с поддержкой Python) и так далее. Результат - полный беспорядок.ParaView в Docker с поддержкой OpenGL

Поэтому я решил создать ParaView в Docker, чтобы изолировать программное обеспечение. Мне определенно нужны возможности сценариев Python для ParaView, которые не являются выбором по умолчанию для пакета репозитория Ubuntu. Here - результат моей работы. Я был вдохновлен this repository, однако есть некоторые недостатки, в частности отсутствие поддержки Python и MPI, и это вилка официального репо ParaView.

Итак, я использовал его и создаю новый репозиторий. Это образ Ubuntu со всеми необходимыми пакетами, ParaView построен с поддержкой MPI и Python. См. README, как его создать и как его запустить. Если кто-то заинтересован, я могу нажать изображение на dockerhub. Обратите внимание, что пользователь на хост-машине должен иметь uid 1000, иначе туннель X-сервера не будет работать правильно. Это может быть, однако, легко исправлено.

Итак, проблема следующая. Когда я бегу ParaView, я вижу это сообщение об ошибке:

libGL error: failed to open drm device: No such file or directory 
libGL error: failed to load driver: i965 

Очевидно, что нет никакого OpenGL ускорения. Есть ли кто-нибудь, кто знает, как включить поддержку OpenGL в докере? Я знаю this репозиторий, однако мне не нравится решение через vnc. Есть ли другой способ, как сделать то же самое? Я не знаком с OpenGL, поэтому любая помощь очень ценится.

ответ

2

Вы можете попробовать следующие действия:

  • установить мез-утилиту в изображении
  • добавить пользователь контейнера для группы видео.

Тогда вы должны иметь возможность использовать программное обеспечение, созданное OpenGL.

Общий доступ к разъему Unix от хоста может иметь некоторые оговорки. Вы можете использовать mviereck/x11docker для запуска изображения на втором X-сервере. Программное обеспечение, созданное OpenGL, отлично работает. Аппаратное обеспечение является экспериментальным и в разработке.

На вашем примере репо GitHub вы используете дисплей хоста: 0, деля $DISPLAY и UNIX сокеты:

docker run -ti -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix paraview 

Если вы разделяете все файлы в dev/dri с контейнером (особенно /dev/dri/card0), скорее всего, вы получите оборудование ускорение. Если вы получаете некоторые сбои в рендеринге, вы можете использовать опцию запуска докера --ipc=host. В зависимости от настройки X нужно также делиться ~/.Xauthority и $XAUTHORITY или устанавливать xhost +SI:localuser:root на хост, если пользователь контейнера является root.

ВНИМАНИЕ: Эта установка разрушает изоляцию контейнера! (Для лучшей изоляции, проверьте x11docker.)

1

В дополнение к тому, что предложил @mviereck, на контейнере nvidia-docker, мне нужно было сделать docker run --privileged.Вся моя команда запуска docker выглядит так:

Очевидно, что это не идеальное решение, но этого достаточно для многих случаев локального использования, где изоляция не является серьезной проблемой.

CMD="${DOCKER} run --detach=true \                                                                                   
       --privileged \                                                                                    
       --group-add ${DOCKER_GROUP_ID} \                                                                                
       --env HOME=${HOME_DIR} \                                                                                  
       --env DISPLAY \                                                                                    
       --interactive \                                                                                    
       --name DevContainer \                                                                                   
       --net=host \                                                                                     
       --rm \                                                                                      
       --tty \                                                                                      
       --user=${USER_ID}:${GROUP_ID} \                                                                                
       --volume $HOME_DIR_HOST:${HOME_DIR} \                                                                               
       --volume $WORK_DIR:${WORK_DIR} \                                                                                
       --volume /tmp/.X11-unix:/tmp/.X11-unix \                                                                              
       --volume /var/run/docker.sock:/var/run/docker.sock \                                                                           
       ${IDEA_IMAGE}" 

Многие из этих вариантов являются излишними для OpenGL, но полезны для определенных приложений, нуждающихся в расширенном доступе.

Поскольку я использую nvidia docker container, $DOCKER на самом деле nvidia-docker в моем случае. Я также добавил своего хозяина к группе video, хотя я не уверен, что это значило.

Смежные вопросы