从Dockerfile生成docker映像失败,但无法手动生成

从Dockerfile生成docker映像失败,但无法手动生成,docker,opencv,dockerfile,Docker,Opencv,Dockerfile,我有一个Dockerfile,其中一个步骤是编译opencv。如果在docker构建中执行,则该过程将失败,但如果我以交互方式手动执行每个步骤,则该过程将有效 你有什么建议吗 这是docker文件: FROM nvcr.io/nvidia/l4t-base:r32.4.4 RUN apt-get update; apt-get -y upgrade RUN DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential pkg-

我有一个Dockerfile,其中一个步骤是编译opencv。如果在docker构建中执行,则该过程将失败,但如果我以交互方式手动执行每个步骤,则该过程将有效

你有什么建议吗

这是docker文件:

FROM nvcr.io/nvidia/l4t-base:r32.4.4
RUN apt-get update; apt-get -y upgrade
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential pkg-config  libtbb2 libtbb-dev  libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libavresample-dev libtiff-dev libjpeg-dev libpng-dev python-tk libgtk-3-dev libcanberra-gtk-module libcanberra-gtk3-module libv4l-dev libdc1394-22-dev cmake python3-dev python-dev python-numpy python3-numpy ccache
RUN mkdir /src; wget -O /src/opencv-3.4.0.tar.gz https://github.com/opencv/opencv/archive/3.4.0.tar.gz; wget -O /src/opencv_contrib-3.4.0.tar.gz https://github.com/opencv/opencv_contrib/archive/3.4.0.tar.gz; cd /src/; tar xzf opencv-3.4.0.tar.gz; tar xzf opencv_contrib-3.4.0.tar.gz; rm -f /src/*gz
RUN cd /src/opencv-3.4.0; mkdir build; cd build; LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda-10.2/targets/aarch64-linux/lib; PATH=/usr/local/cuda-10.2/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX:PATH=/opt/opencv/3.4.0 -D WITH_CUDA=ON -D CUDA_ARCH_PTX="" -D CUDA_ARCH_BIN="5.3,6.2,7.2" -D WITH_CUBLAS=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_java=OFF -D WITH_GSTREAMER=ON -D WITH_GTK=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=ON -DCUDA_CUDA_LIBRARY=/usr/local/cuda-10.2/targets/aarch64-linux/lib/stubs/libcuda.so -D OPENCV_EXTRA_MODULES_PATH=/src/opencv_contrib-3.4.0/modules ..
RUN cd /src/opencv-3.4.0/build; make -j4
这就是错误:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_cublas_LIBRARY (ADVANCED)
    linked by target "opencv_cudev" in directory /src/opencv-3.4.0/modules/cudev
    linked by target "opencv_core" in directory /src/opencv-3.4.0/modules/core
    linked by target "opencv_cudaarithm" in directory /src/opencv-3.4.0/modules/cudaarithm
(输出太长,网站不允许我粘贴完整的输出)

同样,在容器中以交互方式运行的步骤也很有效

谢谢

所以我找到了答案,多亏了我最初帖子评论中的提示

这就是我的daemon.json现在的样子:

{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
        "default-runtime": "nvidia" 
}

重要的部分是默认运行时,这在以前是不存在的。

您可能需要仔细研究。注意:英伟达,TencoRT和VISIONWorksS已经准备好在L4T基本容器中使用,因为它们是由英伟达容器运行时从主机提供的。“NVIDIA容器运行时在构建DOCKLILE文件时不活动。是的,问题是OpenCV附带图像V4,而我需要V3…因此,除了编译它,别无选择。然而,我遇到的问题是,在运行的容器中一个接一个地执行相同的步骤是成功的。我猜是缺少了一些环境变量,但事实并非如此。我尝试在Dockerfile中也将这些变量作为ENV选项传递,现在直接从命令行传递。。。两者均未成功…是的,它们在正在运行的容器中成功,因为容器运行时使安装在基础计算机中的CUDA在正在运行的容器中可见。对于docker构建来说,这是不会发生的。这与环境变量无关。要在容器构建过程中实现这一点,您需要在容器中安装CUDA(至少)。因此,要实现@RobertCrovella建议您执行的操作,请在
ENTRYPOINT
脚本中运行这些步骤,而不是在
run
中运行这些步骤。