我通过 Dockerfile 构建我的项目。该项目需要安装Openvino。Openvino 需要通过依赖架构的脚本动态设置一些环境变量。sciprt 是:设置环境变量的脚本
据我了解,Dockerfile 无法将环境变量设置为脚本中的图像。
我如何按照方法解决问题?
我需要设置变量,因为稍后我继续安装查看环境变量的 opencv。
我认为如果我将脚本放在 ~/.bashrc 文件中以在连接到 bash 时设置变量,如果我有任何技巧可以启动 bash 一秒钟,它可以解决我的问题。
其次,我认为构建 openvino 映像,从中创建容器,连接它并通过在容器中手动运行脚本来初始化变量。之后,将容器转换为图像。创建新的 Dockerfile 并通过使用此映像进行后续步骤来继续构建步骤。
Openvino Dockerfile exp 和运行脚本的行
我的 Dockerfile:
FROM ubuntu:18.04
ARG DOWNLOAD_LINK=http://registrationcenter-download.intel.com/akdlm/irc_nas/16612/l_openvino_toolkit_p_2020.2.120.tgz
ENV INSTALLDIR /opt/intel/openvino
# openvino download
RUN curl -LOJ "${DOWNLOAD_LINK}"
# opencv download
RUN wget -O opencv.zip https://github.com/opencv/opencv/archive/4.3.0.zip && \
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.3.0.zip
RUN apt-get -y install sudo
# openvino installation
RUN tar -xvzf ./*.tgz && \
cd l_openvino_toolkit_p_2020.2.120 && \
sed -i 's/decline/accept/g' silent.cfg && \
./install.sh -s silent.cfg && \
# rm -rf /tmp/* && \
sudo -E $INSTALLDIR/install_dependencies/install_openvino_dependencies.sh
WORKDIR /home/sa
RUN /bin/bash -c "source /opt/intel/openvino/bin/setupvars.sh" && \
echo "source /opt/intel/openvino/bin/setupvars.sh" >> /home/sa/.bashrc && \
echo "source /opt/intel/openvino/bin/setupvars.sh" >> ~/.bashrc && \
$INSTALLDIR/deployment_tools/model_optimizer/install_prerequisites/install_prerequisites.sh && \
$INSTALLDIR/deployment_tools/demo/demo_squeezenet_download_convert_run.sh
RUN bash
# opencv installation
RUN unzip opencv.zip && \
unzip opencv_contrib.zip && \
# rm opencv.zip opencv_contrib.zip && \
mv opencv-4.3.0 opencv && \
mv opencv_contrib-4.3.0 opencv_contrib && \
cd ./opencv && \
mkdir build && \
cd build && \
cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_INF_ENGINE=ON -D ENABLE_CXX11=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=OFF -D INSTALL_C_EXAMPLES=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=/home/sa/opencv_contrib/modules -D PYTHON_EXECUTABLE=/usr/bin/python3 -D WIDTH_GTK=ON -D BUILD_TESTS=OFF -D BUILD_DOCS=OFF -D WITH_GSTREAMER=OFF -D WITH_FFMPEG=ON -D BUILD_EXAMPLES=OFF .. && \
make && \
make install && \
ldconfig
您需要RUN
在使用它的每个命令中以及在容器启动时使 shell 加载该文件。
对于启动时间,您可以使用入口点包装脚本:
#!/bin/sh
# Load the script of environment variables
. /opt/intel/openvino/bin/setupvars.sh
# Run the main container command
exec "$@"
然后在 Dockerfile 中,需要在RUN
命令中包含环境变量脚本,并将该脚本设为镜像的ENTRYPOINT
.
RUN . /opt/intel/openvino/bin/setupvars.sh && \
/opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites/install_prerequisites.sh && \
/opt/intel/openvino/deployment_tools/demo/demo_squeezenet_download_convert_run.sh
RUN ... && \
. /opt/intel/openvino/bin/setupvars.sh && \
cmake ... && \
make && \
...
COPY entrypoint.sh .
ENTRYPOINT ["./entrypoint.sh"]
CMD same as the command you set in the original image
如果您docker exec
在容器中调试 shell,它们将看不到这些环境变量,您需要手动重新读取环境变量脚本。如果你习惯docker inspect
查看容器的底层细节,它也不会显示环境变量。
看起来该脚本只是设置了几个环境变量(尤其是$LD_LIBRARY_PATH
和$PYTHONPATH
),如果设置为有点冗长的值,您可以使用ENV
Dockerfile 中的语句设置这些变量。
如果您查看docker build
输出,则---> 0123456789ab
在每个构建步骤之后都有类似的行;这些是您可以使用的有效图像 ID docker run
。你可以跑
docker run --rm 0123456789ab \
env \
| sort > env-a
docker run --rm 0123456789ab \
sh -c '. /opt/intel/openvino/bin/setupvars.sh && env' \
| sort > env-b
这将为您提供两个带有环境变量的本地文件,无论是否运行此安装脚本。找出不同之处(例如,使用comm (1)),放在ENV
每一行之前,然后将其添加到您的 Dockerfile 中。
你不能真正.bashrc
在 Docker 中使用。许多常见路径不调用其启动文件:在该文档的语言中,DockerfileRUN
命令和docker run
指令都不是“交互式 shell”,因此它们不读取点文件,并且通常docker run ... command
根本不调用 shell .
您也不需要sudo
(您已经以 root 身份运行,交互式密码提示将失败);RUN sh -c
是多余的(Docker 自己插入);并且source
不是标准的 shell 命令(更喜欢标准的.
,它甚至可以在没有 shell 扩展的基于 Alpine 的图像上工作)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句