1

我正在尝试在 gstreamer 中构建一个使用 nvidia 硬件解码的 docker 映像,并且在制作映像时遇到了一个奇怪的问题。

docker build构建过程在运行(或)时找不到与 nvidia cuda 相关的东西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.

从容器内构建时不会发生这种情况。

缺少错误很可能与 ninja+meson 构建系统有关,该构建系统查找兼容的包,报告异常,但不抛出异常并继续,就好像没有发生任何错误一样

EDIT2
回答评论:要构建它并得到错误,只需构建附加的 docker 图像:

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

这会将所有输出转储到build.log文件中。
我没有可以用于此目的的 docker 注册表,并且 docker 镜像按照 docker 标准(约 8 Gigs)变得相当大,但要成功生成,它相当简单:

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

或者

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

这对我来说似乎同样有效。注意没有 --rm标志!从容器内:

#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)并在主机 shell 中:

  • sudo docker container ls -a查看所有容器,包括停止的容器
  • 从 gst16:latest 获取 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验证它是否正常工作

编辑3

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

1 回答 1

1

我想我找到了解决方案/原因

写在这里以防有人发现自己处于类似情况,而且我讨厌找到有类似问题但没有答案的旧线程或“没关系,我解决了”作为唯一的后续行动

Docker build 与 nvidia 运行时没有任何联系,gstreamer 需要访问完整的 nvidia 工具链才能构建需要它的插件。这将通过 gstreamer 1.18 解决,但在此之前,无法在 docker build 中使用 nvidia 编解码器构建 gstreamer。

解决方法:

  1. 构建具有所有依赖项的映像。
  2. 使用 runtime="nvidia" 运行所述图像的容器,但不要使用 --rm 标志
  3. 在容器中,构建 gstreamer 并照常安装。
  4. 使用 gst-inspect-1.0 进行验证
  5. 将容器提交为新图像:docker commit <container_name> <temporary_image_name>
  6. 正确标记临时图像。
于 2019-12-16T10:59:46.420 回答