Docker run vs build-构建gstreamer的不同行为

问题描述 投票:2回答:1

我正在尝试构建一个在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.

从容器内部构建时不会发生。

缺少错误的可能性很大,与忍者+介子构建系统有关,该系统寻找兼容的程序包,报告异常,但不会抛出该异常,并且继续运行,好像没有发生任何错误一样。

EDIT2回答评论:要构建它并获取错误,只需构建附加的docker映像:

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

这会将所有输出转储到build.log文件中。我没有可用于此目的的Docker注册表,并且按Docker标准(〜8 Gigs),docker映像变得非常大,但是要成功制作,它非常简单:

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)并在主机外壳中:

  • [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以验证其是否正常工作
  • EDIT3

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

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

docker gstreamer nvidia-docker
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.