Docker run vs build - build gstreamer Разное поведение - PullRequest
2 голосов
/ 23 сентября 2019

Я пытаюсь создать образ докера, который использует аппаратное декодирование nvidia в gstreamer и столкнулся со странной проблемой при создании образа.

Процесс сборки не находит вещи, связанные с nvidia cuda, при запуске docker build (или nvidia-docker build), но когда я раскручиваю сбойное изображение как контейнер и выполняю те же самые шаги изнутри контейнеравсе работает.Я даже сохранил контейнер как изображение, которое дало мне постоянное изображение, которое работает как задумано.

Кто-нибудь испытывал подобную проблему и может пролить свет на него?

Dockerfile:
FROM nvcr.io/nvidia/deepstream:3.0-18.11 AS base

ENV DEBIAN_FRONTEND noninteractive

#install some dependencies. NOTE - not removing apt cache for the MWE
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    libdc1394-22 \
    tmux \
    vim \
    libjpeg-dev \
    libpng-dev \
    libpng12-dev \
    cuda-toolkit-10-0 \
    python3-setuptools \
    python3-pip ninja-build pkg-config gobject-introspection gnome-devel bison flex libgirepository1.0-dev liborc-0.4-dev

RUN pip3 install meson && ldconfig

FROM base
#pull and make gstreamer:
RUN cd /tmp && mkdir gstreamer
RUN git clone https://github.com/GStreamer/gst-build.git /tmp/gstreamer \
    && cd /tmp/gstreamer \
    && git checkout tags/1.16.0 \
    && ./setup.py -Dgtk_doc=disabled -Dgst-plugins-bad:nvdec=enabled -Dgst-plugins-bad:nvenc=enabled -Dgst-plugins-bad:iqa=disabled -Dgst-plugins-bad:bluez=disabled --reconfigure \
    && ninja -C build \
    && ninja install -C build

Тестирование: сборка и запуск контейнера.Внутри контейнера:

$ gst-inspect-1.0 nvdec
  No such element or plugin 'nvdec'
$ cd /tmp/gstreamer
$ ./setup.py -Dgtk_doc=disabled -Dgst-plugins-bad:nvdec=enabled -Dgst-plugins-bad:nvenc=enabled -Dgst-plugins-bad:iqa=disabled -Dgst-plugins-bad:bluez=disabled --reconfigure 
$ ninja -C build
$ ninja install -C build
$ gst-inspect-1.0 nvdec
  Factory Details:
  Rank                     primary (256)
  [... all plugin parameters show up]
  GObject
    +----GInitiallyUnowned
         +----GstObject
               +----GstElement
                    +----GstVideoDecoder
                         +----GstNvDec

EDIT1
Изображение создается без ошибок, только когда я пытаюсь вызвать gstreamer, оно создается без ускорения.Я заметил, что в процессе сборки основное различие составляет

meson.build:109:2: Exception: Problem encountered: The nvdec plugin was enabled explicitly, but required CUDA dependencies were not found.

, чего не происходит при сборке из контейнера.

Отсутствие ошибки связано, скорее всего, с ниндзя +Система сборки meson, которая ищет совместимые пакеты, сообщает об исключении, но не выдает его и продолжает работу, как будто ничего плохого не произошло

EDIT2
Ответ на комментарий: собрать и получитьошибка, просто создайте прикрепленный образ докера:

sudo docker build -t gst16:latest . > build.log

Это выведет весь вывод в файл build.log.
У меня нет реестра докера, которыйЯ мог бы использовать для этого, и образ докера становится достаточно большим по стандартам докера (~ 8 гигабайт), но для успешного производства это довольно просто:

sudo docker run --runtime="nvidia" -ti gst16:latest /bin/bash

или

sudo nvidia-docker run -ti gst16:latest /bin/bash

, который, кажется, работает для меня то же самое.Обратите внимание no --rm flag!Из контейнера:

#check if nvidia decoder plugin is there:
gst-inspect-1.0 nvdec
#fail!
#now build it from within:
cd /opt/gstreamer
./setup.py -Dgtk_doc=disabled -Dgst-plugins-bad:nvdec=enabled -Dgst-plugins-bad:nvenc=enabled -Dgst-plugins-bad:iqa=disabled -Dgst-plugins-bad:bluez=disabled --reconfigure
ninja -C build
ninja install -C build
gst-inspect-1.0 nvdec
#success reported

Теперь, чтобы получить изображение, выйдите из контейнера (ctrl + d) и в оболочке хоста:

  • sudo docker container ls -a, чтобы просмотреть все контейнерывключая остановленные
  • из gst16: последние получают CONTAINER_ID и копируют его
  • sudo docker commit <CONTAINER_ID> gst16:manual, и через несколько секунд вы должны сохранить контейнер как изображение.Проверьте с помощью sudo docker images
  • , запустите новый образ с помощью sudo docker run --runtime=`nvidia` --rm -ti gst16:manual /bin/bash
  • из контейнера, попробуйте еще раз gst-inspect-1.0 nvdec, чтобы убедиться, что он работает

EDIT3

$ nvidia-docker --version 
  Docker version 18.09.0, build 4d60db4 
...