我正在尝试在 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