Docker 运行 vs build - build gstreamer 不同的行为

Docker run vs build - build gstreamer Different behaviour

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

在运行宁docker build(或nvidia-docker build)时构建过程没有找到与nvidia cuda相关的东西,但是当我将失败的图像作为容器旋转并执行容器内的那些完全相同的步骤一切正常。我什至将容器保存为图像,这给了我一个按预期工作的持久图像。

有没有人遇到过类似的问题,可以解释一下吗?

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

这对我来说似乎是一样的。注意 no --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:

EDIT3

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

我想我找到了 solution/reason

写在这里以防有人发现自己处于类似情况,而且我讨厌找到有类似问题但没有答案的旧线程或 "nevermind, I solved it" 作为唯一的跟进

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

解决方法:

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