我通过Dockerfile构建我的项目。该项目需要安装Openvino。 Openvino需要通过依赖于体系结构的脚本动态设置一些环境变量。标题是:script to set environment variables
据我了解,Dockerfile无法设置环境变量以从脚本进行映像。
如何遵循解决问题的方法?
我需要设置变量,因为稍后我会继续安装看起来环境变量的opencv。
我认为,如果我将脚本放到〜/ .bashrc文件中以在连接到bash时设置变量,那么如果我有任何技巧可以一秒钟启动bash,则可以解决我的问题。
第二,我认为构建openvino映像,从中创建容器,通过在容器中手动运行脚本来连接它并初始化变量。之后,将容器转换为图像。创建新的Dockerfile并继续使用此映像进行构建步骤。
Openvino Dockerfile exp and line that run the script
我的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
答案 0 :(得分:3)
您需要使外壳程序在使用它的每个RUN
命令中以及在容器启动时,都将该文件加载到该文件中。
对于启动时间,您可以使用入口点包装器脚本:
#!/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
在容器中调试外壳,它们将看不到这些环境变量,因此您需要手动重新读取环境变量脚本。如果您使用docker inspect
查看容器的底层详细信息,它也不会显示环境变量。
看起来,该脚本只是设置了几个环境变量(尤其是$LD_LIBRARY_PATH
和$PYTHONPATH
)(如果设置为有些冗长的值),则可以使用ENV
进行设置Dockerfile中的语句。
如果您查看docker build
的输出,则在每个构建步骤之后都有类似---> 0123456789ab
的行;这些是您可以docker run
使用的有效图像ID。你可以跑
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中。
您不能在Docker中真正使用.bashrc
。许多常见路径不会调用其startup files:在该文档的语言中,Dockerfile RUN
命令和docker run
指令都不是“交互式shell”,因此它们不会读取点文件,通常docker run ... command
根本不会调用Shell。
您也不需要sudo
(您已经以root用户身份运行,并且交互式密码提示将失败); RUN sh -c
是多余的(Docker自行插入);并且source
不是标准的Shell命令(最好使用标准的.
,即使在没有Shell扩展名的基于Alpine的图像上也可以使用)。