-
Notifications
You must be signed in to change notification settings - Fork 11
Description
Context:
- Original: Changes for nvidia-docker v2 support car_demo#31
- Followup: opengl issure docker_images#105
Supplementary Context:
- Nvidia Docker Issue: nvidia-docker 1 can run OpenGL applications; nvidia-docker 2 can't NVIDIA/nvidia-docker#534
- ROS Wiki: Using Hardware Acceleration with Docker
- Nvidia's Openl Image: https://gitlab.com/nvidia/opengl/blob/ubuntu16.04/1.0-glvnd/devel/Dockerfile
Solution:
Perhaps we could add a template for adding the necessary configuration steps for supporting nvidia hardware acceleration in containers for users display forwarding rviz, gzviewer, or other opengl dependent programs. This could be done by mimicking nvidia's own image build steps. Then we could simply add a new tags for the OSRF docker repos that use the template for new child images.
Here is a rough but working example:
FROM osrf/ros:kinetic-desktop-full
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config \
libxau-dev \
libxdmcp-dev \
libxcb1-dev \
libxext-dev \
libx11-dev && \
rm -rf /var/lib/apt/lists/*
COPY --from=nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04 \
/usr/local/lib/x86_64-linux-gnu \
/usr/local/lib/x86_64-linux-gnu
COPY --from=nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04 \
/usr/local/share/glvnd/egl_vendor.d/10_nvidia.json \
/usr/local/share/glvnd/egl_vendor.d/10_nvidia.json
RUN echo '/usr/local/lib/x86_64-linux-gnu' >> /etc/ld.so.conf.d/glvnd.conf && \
ldconfig && \
echo '/usr/local/$LIB/libGL.so.1' >> /etc/ld.so.preload && \
echo '/usr/local/$LIB/libEGL.so.1' >> /etc/ld.so.preload
# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES \
${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES \
${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
using --runtime=nvidia and existing X11 forwarding methods.
Perhaps @flx42 would have a better recommendation for something cleaner.
Personally, I find the necessity for multi-stage builds and assortment of in image copies not as elegant at mounting such files from the host and setting a three lightweight variables in the child dockerfile, as originally described in our ROS wiki:
FROM osrf/ros:indigo-desktop-full
# nvidia-docker hooks
LABEL com.nvidia.volumes.needed="nvidia_driver"
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}But as nvidia docker v1 is deprecated and will become harder and harder to build from old sources, it would be nice to adopt a supported solution.